/// <summary>
        /// Performs a deep copy of the specified <see cref="EntityModelSchema"/>.
        /// </summary>
        /// <param name="schema">The <see cref="EntityModelSchema"/> to deep copy.</param>
        /// <returns>A deep copy of the <see cref="EntityModelSchema"/>.</returns>
        public static EntityModelSchema Clone(this EntityModelSchema schema)
        {
            ExceptionUtilities.CheckArgumentNotNull(schema, "schema");

            var model = new EntityModelSchema();

            CopyAnnotations(model, schema.Annotations);

            foreach (var association in schema.Associations)
            {
                model.Add(association.Clone());
            }

            foreach (var complexType in schema.ComplexTypes)
            {
                model.Add(complexType.Clone());
            }

            foreach (var entityContainer in schema.EntityContainers)
            {
                model.Add(entityContainer.Clone());
            }

            foreach (var entityType in schema.EntityTypes)
            {
                model.Add(entityType.Clone());
            }

            foreach (var enumType in schema.EnumTypes)
            {
                model.Add(enumType.Clone());
            }

            foreach (var function in schema.Functions)
            {
                model.Add(function.Clone());
            }

            model.Resolve();

            return(model);
        }
Beispiel #2
0
        /// <summary>
        /// Parses the specified CSDL/SSDL content.
        /// </summary>
        /// <param name="xsdlContent">Content of multiple CSDL or multiple SSDL files.</param>
        /// <returns>
        /// Instance of <see cref="EntityModelSchema"/> which represents Entity Model parsed from the files.
        /// </returns>
        public EntityModelSchema Parse(params XElement[] xsdlContent)
        {
            EntityModelSchema model = new EntityModelSchema();

            this.entityTypeFullNames = new List<string>();
            this.complexTypeFullNames = new List<string>();
            this.enumTypeFullNames = new List<string>();

            foreach (XElement xsdl in xsdlContent)
            {
                this.RegisterNominalTypes(xsdl);
            }

            foreach (XElement xsdl in xsdlContent)
            {
                this.ParseSingleXsdl(model, xsdl);
            }

            return model.Resolve();
        }
        /// <summary>
        /// Converts a model from Edm term into Taupo term
        /// </summary>
        /// <param name="edmModel">The input model in Edm term</param>
        /// <returns>The output model in Taupo term</returns>
        public EntityModelSchema ConvertToTaupoModel(IEdmModel edmModel)
        {
            this.edmModel = edmModel;
            this.associationRegistry = new AssociationRegistry();

            var taupoModel = new EntityModelSchema();

            foreach (var edmComplexType in edmModel.SchemaElements.OfType<IEdmComplexType>())
            {
                ComplexType taupoComplexType = this.ConvertToTaupoComplexType(edmComplexType);
                taupoModel.Add(taupoComplexType);
            }

            foreach (var edmEntityType in edmModel.SchemaElements.OfType<IEdmEntityType>())
            {
                EntityType taupoEntityType = this.ConvertToTaupoEntityType(edmEntityType);
                taupoModel.Add(taupoEntityType);

                // convert to Association using information inside Navigations
                foreach (var edmNavigationProperty in edmEntityType.DeclaredNavigationProperties())
                {
                    if (!this.associationRegistry.IsAssociationRegistered(edmNavigationProperty))
                    {
                        this.associationRegistry.RegisterAssociation(edmNavigationProperty);
                    }
                }
            }

            var edmEntityContainer = edmModel.EntityContainer;
            if (edmEntityContainer != null)
            {
                EntityContainer taupoEntityContainer = this.ConvertToTaupoEntityContainer(edmEntityContainer);
                taupoModel.Add(taupoEntityContainer);
            }

            foreach (var edmFunction in edmModel.SchemaElements.OfType<IEdmOperation>())
            {
                Function taupoFunction = this.ConvertToTaupoFunction(edmFunction);
                taupoModel.Add(taupoFunction);
            }

            foreach (var edmEnum in edmModel.SchemaElements.OfType<IEdmEnumType>())
            {
                EnumType taupoEnumType = this.ConvertToTaupoEnumType(edmEnum);
                taupoModel.Add(taupoEnumType);
            }

            return taupoModel.Resolve();
        }