/// <summary
        /// Compares ComplexType elements from CSDL to IEdmComplexTypes in the model.
        /// </summary>
        /// <param name="schemaElements">The CSDL schema elements to extract ComplexType elements from.</param>
        /// <param name="model">The Edm model to extract the IEdmComplexTypes from.</param>
        private static void CompareComplexTypes(IEnumerable <XElement> schemaElements, IEdmModel model)
        {
            // Index all types in the CSDL by full name to facilitate derived type verification
            var typeIndex = BuildNamedElementIndex(schemaElements, "ComplexType");

            ExceptionUtilities.Assert(typeIndex.Count == model.ComplexTypes().Count(), "Unexpected type count in model");

            foreach (var complexType in typeIndex)
            {
                var modelType = model.ComplexTypes().SingleOrDefault(t => t.FullName() == complexType.Key);
                ExceptionUtilities.Assert(modelType != null, "Failed to find complex type " + complexType.Key);

                var complexTypeElement = complexType.Value;
                CompareBaseType(complexTypeElement, modelType);

                var propertyElements = RecurseBaseTypes(complexTypeElement, typeIndex, (e) => e.EdmElements("Property"));
                CompareStructuralProperties(propertyElements, modelType);

                var navigationPropertyElements = RecurseBaseTypes(complexTypeElement, typeIndex, (e) => e.EdmElements("NavigationProperty"));
                CompareNavigationProperties(navigationPropertyElements, modelType);
            }
        }