public ModelSchema ConvertSchema(IEdmModel edmModel)
        {
            var entityContainers       = edmModel.EntityContainers().ToArray();
            var defaultEntityContainer = entityContainers.First(_ => edmModel.IsDefaultEntityContainer(_));
            var entitySets             = defaultEntityContainer.EntitySets().ToArray();

            var modelSchema     = new ModelSchema();
            var modelEntityRoot = new ModelEntity();
            var complexTypeRoot = new ModelComplexType();

            // TODO: add ns
            modelEntityRoot.Name = new ModelEntityName(defaultEntityContainer.Namespace, null, defaultEntityContainer.Name);
            complexTypeRoot.Name = new ModelEntityName(defaultEntityContainer.Namespace, null, defaultEntityContainer.Name);

            modelEntityRoot.EntityType = complexTypeRoot;
            modelSchema.Entities.Add(modelEntityRoot);
            modelEntityRoot.Kind = ModelEntityKind.Container;

            foreach (var entitySet in entitySets)
            {
                var elementType = entitySet.ElementType;
                var complexType = new ModelComplexType();
                var modelEntity = new ModelEntity();
                complexType.Name       = new ModelEntityName(elementType.Namespace, null, elementType.Name);
                modelEntity.Name       = new ModelEntityName(null, null, entitySet.Name);
                modelEntity.EntityType = complexType;
                modelEntity.Kind       = ModelEntityKind.EntitySet;

                modelSchema.ComplexTypes.Add(complexType);
                modelSchema.Entities.Add(modelEntity);


                var declaredStructuralProperties = elementType.DeclaredStructuralProperties().ToArray();
                foreach (var declaredStructuralProperty in declaredStructuralProperties)
                {
                    var declaredStructuralPropertyType           = declaredStructuralProperty.Type;
                    var declaredStructuralPropertyTypeDefinition = declaredStructuralPropertyType.Definition;
                    var modelProperty = new ModelProperty();
                    modelProperty.Name = declaredStructuralProperty.Name;
                    if (declaredStructuralPropertyType.IsPrimitive())
                    {
                        var modelPropertyType = new ModelScalarType();
                        var vas = declaredStructuralProperty.VocabularyAnnotations(edmModel).ToArray();
                        if (declaredStructuralPropertyTypeDefinition is IEdmSchemaElement edmSchemaElement)
                        {
                            modelPropertyType.Name = new ModelEntityName(edmSchemaElement.Namespace, null, edmSchemaElement.Name);
                        }
                        else
                        {
                            modelPropertyType.Name = new ModelEntityName(null, null, declaredStructuralPropertyType.FullName());
                        }
                        modelPropertyType.IsNullable = declaredStructuralPropertyType.IsNullable;
                        modelProperty.Type           = modelPropertyType;
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                    complexType.Properties.Add(modelProperty);
                }

                //complexType.Properties
            }

            foreach (var entitySet in entitySets)
            {
                var entityName  = new ModelEntityName(null, null, entitySet.Name);
                var modelEntity = modelSchema.Entities.FirstOrDefault(_ => _.Name == entityName);

                var navigationTargets = entitySet.NavigationTargets.ToArray();
                foreach (var navigationTarget in navigationTargets)
                {
                    //
                    var navigationProperty = navigationTarget.NavigationProperty;

                    if (navigationProperty is IEdmNavigationProperty edmNavigationProperty)
                    {
                        if (navigationProperty.ContainsTarget)
                        {
                        }
                    }
                    var navigationPropertyPartner = navigationProperty.Partner;
                    var targetEntitySet           = navigationTarget.TargetEntitySet;
                    //
                    var naviFromProperties = navigationProperty.DependentProperties?.ToArray();
                    var naviToProperties   = navigationPropertyPartner.DependentProperties?.ToArray();

                    var modelRelation     = new ModelRelation();
                    var targetEntityName  = new ModelEntityName(null, null, targetEntitySet.Name);
                    var targetModelEntity = modelSchema.Entities.FirstOrDefault(_ => _.Name == targetEntityName);
                    modelRelation.Name = navigationTarget.TargetEntitySet.Name;

                    //modelRelation.MasterEntity =
                    //modelRelation.ForeignEntity = targetModelEntity;
                    modelRelation.ForeignName = targetEntityName;
                    modelSchema.Relations.Add(modelRelation);
                }
            }

            return(modelSchema);
        }
Ejemplo n.º 2
0
        public ModelComplexType BuildComplexTypeNavigationProperty(EdmxModel edmxModel, ModelSchema modelSchema, CsdlEntityTypeModel entityTypeModel, MetaModelBuilder metaModelBuilder, ModelErrors errors)
        {
            ModelComplexType result     = null;
            var entityTypeModelName     = entityTypeModel.Name;
            var entityTypeModelFullName = entityTypeModel.FullName;

            var lstFound = modelSchema.ComplexTypes.FindByKey2(entityTypeModelFullName ?? entityTypeModelName);

            if (lstFound.Count == 1)
            {
                result = lstFound[0];
            }
            else if (lstFound.Count > 1)
            {
                errors.AddErrorOrThrow(new ModelErrorInfo($"found key {entityTypeModelFullName ?? entityTypeModelName} #{lstFound.Count} times.", entityTypeModelFullName ?? entityTypeModelName));
                result = lstFound[0];
            }
            else
            {
                result = BuildComplexType(edmxModel, modelSchema, entityTypeModel, metaModelBuilder, errors);
            }
            if (result == null)
            {
                return(null);
            }

            foreach (var navigationProperty in entityTypeModel.NavigationProperty)
            {
                if (navigationProperty.RelationshipName is null)
                {
                    //navigationProperty.Name
                    //navigationProperty.TypeModel
                    //navigationProperty.PartnerModel
                    throw new NotImplementedException("v4 NavigationProperty");
                }
                else
                {
                    // v3
                    //if (navigationProperty.FromRoleModel is null) {
                    //} else {
                    //}

                    if (navigationProperty.ToRoleModel is null)
                    {
                    }
                    else
                    {
                        var toModel           = navigationProperty.ToRoleModel.TypeModel;
                        var lstToComplexTypes = modelSchema.ComplexTypes.FindByKey2(toModel.FullName);
                        if (lstToComplexTypes.Count == 1)
                        {
                            var toComplexType = lstToComplexTypes[0];
                            var navigationPropertyExternalName = navigationProperty.Name;
#warning magic needed here
                            var navigationPropertyName = navigationPropertyExternalName;

                            bool isCollection = false;
                            bool isOptional   = false;
                            switch (navigationProperty.ToRoleModel.GetMultiplicity())
                            {
                            case MultiplicityKind.Unknown:
                                break;

                            case MultiplicityKind.OneOptional:
                                isOptional = true;
                                break;

                            case MultiplicityKind.One:
                                break;

                            case MultiplicityKind.Multiple:
                                isCollection = true;
                                break;

                            default:
                                break;
                            }

                            var modelNavigationProperty = result.CreateNavigationProperty(
                                navigationPropertyName,
                                navigationPropertyExternalName,
                                toComplexType,
                                isOptional,
                                isCollection
                                );
                        }
                    }
                }
            }

            /*
             */
            return(result);
        }