예제 #1
0
 public void ResolveNames(EdmxModel edmxModel, ModelErrors errors)
 {
     edmxModel.ResolveNames(errors);
 }
예제 #2
0
        public ModelSchema Build(
            EdmxModel edmxModel,
            ModelSchema modelSchema,
            MetaModelBuilder metaModelBuilder,
            ModelErrors errors)
        {
            if (modelSchema == null)
            {
                modelSchema = new ModelSchema();
            }
            //if (metaMappingSchema == null) { metaMappingSchema = new MetaMappingSchema(); }
            if (metaModelBuilder == null)
            {
                metaModelBuilder = new MetaModelBuilder();
            }

            if (!edmxModel.IsFrozen())
            {
                edmxModel.AddCoreSchemaIfNeeded(errors);
                edmxModel.Freeze();
            }

            var defaultEntityContainers = edmxModel.DataServices.SelectMany(_ => _.EntityContainer).Where(_ => _.IsDefaultEntityContainer).ToList();

            if (defaultEntityContainers.Count != 1)
            {
                defaultEntityContainers = edmxModel.DataServices.SelectMany(_ => _.EntityContainer).ToList();
            }
            if (defaultEntityContainers.Count != 1)
            {
                errors.AddErrorOrThrow($"DefaultEntityContainers #{defaultEntityContainers.Count} found.", "model");
                return(modelSchema);
            }
            var defaultEntityContainer = defaultEntityContainers[0];

            edmxModel.ResolveNames(errors);
            if (errors.HasErrors())
            {
                return(modelSchema);
            }

            foreach (var dataServices in edmxModel.DataServices)
            {
                foreach (var scalarTypeModel in dataServices.ScalarTypeModel)
                {
                    this.BuildScalarType(edmxModel, modelSchema, scalarTypeModel, metaModelBuilder, errors);
                }
            }
            foreach (var dataServices in edmxModel.DataServices)
            {
                foreach (var entityTypeModel in dataServices.EntityType)
                {
                    this.BuildComplexType(edmxModel, modelSchema, entityTypeModel, metaModelBuilder, errors);
                }
            }
            foreach (var dataServices in edmxModel.DataServices)
            {
                foreach (var entityTypeModel in dataServices.EntityType)
                {
                    this.BuildComplexTypeNavigationProperty(edmxModel, modelSchema, entityTypeModel, metaModelBuilder, errors);
                }
            }
            foreach (var dataServices in edmxModel.DataServices)
            {
                foreach (var association in dataServices.Association)
                {
                    this.BuildAssociation(edmxModel, modelSchema, association, metaModelBuilder, errors);
                }
            }
            //foreach (var dataServices in edmxModel.DataServices) {
            //    foreach (var entityContainer in dataServices.EntityContainer) {
            //        if (entityContainer.IsDefaultEntityContainer) { continue; }
            //    }
            //}


            foreach (var entitySet in defaultEntityContainer.EntitySet)
            {
                var entityTypeModel = entitySet.EntityTypeModel;
                if (entityTypeModel == null)
                {
                    errors.AddErrorOrThrow("entitySet.EntityTypeModel not found", entitySet.Name);
                }
                else
                {
                    var entityTypeModelName     = entityTypeModel.Name;
                    var entityTypeModelFullName = entityTypeModel.FullName;

                    var modelComplexType = this.BuildComplexType(edmxModel, modelSchema, entityTypeModel, metaModelBuilder, errors);

                    var entitySetName = entitySet.Name;
                    var modelEntity   = metaModelBuilder.CreateModelEntity(
                        entitySetName,
                        ModelEntityKind.EntitySet,
                        errors);
                    if (modelEntity.Owner == null)
                    {
                        modelSchema.Entities.Add(modelEntity);
                    }
                    if (modelComplexType is null)
                    {
                        errors.AddErrorOrThrow($"{entityTypeModelFullName ?? entityTypeModelName} not found", entitySet.Name);
                    }
                    else
                    {
                        modelEntity.EntityType = modelComplexType;
                    }
                }
            }

            //foreach (var associationSet in defaultEntityContainer.AssociationSet) {
            //    foreach (var end in associationSet.End) {
            //        if (!(end.EntitySetModel is null)) {
            //            var roleName = d.RoleName;
            //        }
            //    }
            //}

            return(modelSchema);
        }