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); }
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); }