Example #1
0
        public ModelScalarType SuggestType(IModelScalarTypeFacade modelScalarTypeFacade)
        {
            var result = new ModelScalarType();

            if (modelScalarTypeFacade.Nullable.GetValueOrDefault(true))
            {
                if (this.Type.IsValueType)
                {
                    result.Type = typeof(Nullable <>).MakeGenericType(new Type[] { this.Type });
                }
                else
                {
                    result.Type = this.Type;
                }
            }
            else
            {
                result.Type = this.Type;
            }
            result.Nullable    = modelScalarTypeFacade.Nullable;
            result.MaxLength   = modelScalarTypeFacade.MaxLength;
            result.FixedLength = modelScalarTypeFacade.FixedLength;
            result.Precision   = modelScalarTypeFacade.Precision;
            result.Scale       = modelScalarTypeFacade.Scale;
            result.Unicode     = modelScalarTypeFacade.Unicode;
            return(result);
        }
        public ModelScalarType SuggestType(MetaModelBuilder metaModelBuilder)
        {
            //ModelTypeScalar scalarType = this.Type?.GetScalarType();
            ModelSematicScalarType scalarType = this.SqlType.GetScalarType();
            var result = new ModelScalarType {
                Name         = scalarType.Name.GetQFullName("[", 2),
                ExternalName = scalarType.GetCondensed(),
                MaxLength    = this.MaxLength,
                Scale        = this.Scale,
                Precision    = this.Precision,
                Nullable     = this.Nullable,
                Type         = scalarType.GetClrType()
            };

            return(result);
        }
Example #3
0
        public ModelScalarType BuildScalarType(EdmxModel edmxModel, ModelSchema modelSchema, CsdlScalarTypeModel scalarTypeModel, MetaModelBuilder metaModelBuilder, ModelErrors errors)
        {
            if (string.Equals(scalarTypeModel.Namespace, "Edm", StringComparison.Ordinal))
            {
                return(null);
            }
            //
#warning  BuildScalarType - when does this happen?
            var             name     = scalarTypeModel.Name;
            var             fullName = scalarTypeModel.FullName;
            ModelScalarType result   = new ModelScalarType {
                Name         = name,
                ExternalName = fullName
            };
            modelSchema.ScalarTypes.Add(result);
            return(result);
        }
Example #4
0
        public override List <string> Build()
        {
            var resultErrors    = new List <string>();
            var modelDefinition = this.ModelDefinition;
            var modelSchema     = this.ModelSchema ?? (this.ModelSchema = new ModelSchema());

            this.EdmModel = null;

            IEdmModel edmModel;

            using (var reader = new System.IO.StringReader(modelDefinition.MetaData)) {
                using (var xmlReader = System.Xml.XmlReader.Create(reader)) {
                    IEnumerable <EdmError> edmErrors;
                    var parseResult = Microsoft.Data.Edm.Csdl.EdmxReader.TryParse(xmlReader, out edmModel, out edmErrors);
                    if (!parseResult)
                    {
                        resultErrors.AddRange(edmErrors.Select(_ => _.ErrorMessage));
                        //throw new InvalidOperationException("Failed to load model : " + string.Join(Environment.NewLine, errors.Select(e => e.ErrorMessage)));
                        return(resultErrors);
                    }
                }
            }

            this.EdmModel = edmModel;
            // this.Rules.

            var lstTypeDefinition  = edmModel.SchemaElements.Where(schemaElement => schemaElement.SchemaElementKind == Microsoft.Data.Edm.EdmSchemaElementKind.TypeDefinition).ToList();
            var lstValueTerm       = edmModel.SchemaElements.Where(schemaElement => schemaElement.SchemaElementKind == Microsoft.Data.Edm.EdmSchemaElementKind.ValueTerm).ToList();
            var lstEntityContainer = edmModel.SchemaElements.Where(schemaElement => schemaElement.SchemaElementKind == Microsoft.Data.Edm.EdmSchemaElementKind.EntityContainer).ToList();

            var typeDefinitionsByName = new Dictionary <ModelEntityName, ModelTableType>(ModelUtility.Instance.ModelEntityNameEqualityComparer);
            var entityByName          = new Dictionary <ModelEntityName, ModelEntity>(ModelUtility.Instance.ModelEntityNameEqualityComparer);

            foreach (var typeDefinition in lstTypeDefinition)
            {
                // typeDefinition.FullName
                if (typeDefinition is Microsoft.Data.Edm.IEdmStructuredType structuredType)
                {
                    var modelTableType = new ModelTableType();
                    modelTableType.Name = ConvertToModelEntityName(typeDefinition);
                    modelSchema.TableTypes.Add(modelTableType);
                    typeDefinitionsByName[modelTableType.Name] = modelTableType;
                    var declaredStructuralProperties = structuredType.DeclaredStructuralProperties().ToArray();
                    var declaredProperties           = structuredType.DeclaredProperties.ToArray();
                    foreach (var declaredProperty in declaredProperties)
                    {
                        if (declaredProperty.PropertyKind == EdmPropertyKind.None)
                        {
                            var modelProperty = new ModelProperty();
                            modelProperty.Name = declaredProperty.Name;
                            // modelProperty.Type
                            var declaredPropertyType = declaredProperty.Type;
                            modelTableType.Properties.Add(modelProperty);
                        }
                        else if (declaredProperty.PropertyKind == EdmPropertyKind.Structural)
                        {
                            var modelProperty = new ModelProperty();
                            modelProperty.Name = declaredProperty.Name;
                            // modelProperty.Type
                            var declaredPropertyType = declaredProperty.Type;
                            if (declaredPropertyType is IEdmPrimitiveTypeReference primitiveTypeReference)
                            {
                                var modelScalarType = new ModelScalarType();
                                var definition      = primitiveTypeReference.Definition;
                                if (definition is Microsoft.Data.Edm.IEdmSchemaElement definitionAsSchemaElement)
                                {
                                    var definitionName = ConvertToModelEntityName(definitionAsSchemaElement);
                                    modelScalarType.Name = definitionName;
                                }
                                else
                                {
                                    throw new InvalidOperationException();
                                }
                                modelScalarType.IsNullable = primitiveTypeReference.IsNullable;
                                modelProperty.Type         = modelScalarType;
                            }
                            else
                            {
                            }
                            modelTableType.Properties.Add(modelProperty);
                        }
                        else if (declaredProperty.PropertyKind == EdmPropertyKind.Navigation)
                        {
                            var modelProperty = new ModelProperty();
                            modelProperty.Name = declaredProperty.Name;
                            modelTableType.Properties.Add(modelProperty);
                        }
                    }
                }
            }

            foreach (IEdmSchemaElement schemaElement in lstEntityContainer)
            {
                if (schemaElement is Microsoft.Data.Edm.IEdmEntityContainer entityContainer)
                {
                    bool isDefaultEntityContainer     = false;
                    var  annoIsDefaultEntityContainer = edmModel.DirectValueAnnotationsManager.GetDirectValueAnnotations(entityContainer).FirstOrDefault(_ => _.NamespaceUri == "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" && _.Name == "IsDefaultEntityContainer");
                    if (annoIsDefaultEntityContainer?.Value is Microsoft.Data.Edm.Library.Values.EdmStringConstant stringConstant)
                    {
                        if (string.Equals(stringConstant.Value, "true", StringComparison.OrdinalIgnoreCase) || stringConstant.Value == "1")
                        {
                            isDefaultEntityContainer = true;
                        }
                    }
                    else if (annoIsDefaultEntityContainer?.Value is Microsoft.Data.Edm.Library.Values.EdmBooleanConstant booleanConstant)
                    {
                        if (booleanConstant.Value)
                        {
                            isDefaultEntityContainer = true;
                        }
                    }
                    if (isDefaultEntityContainer)
                    {
                        var entityName = ConvertToModelEntityName(entityContainer);
                        modelSchema.RootEntityName = entityName;
                        //if (modelSchema.Name == null) {
                        //    modelSchema.Name = entityName;
                        //}
                    }

                    var modelEntityContainer = new ModelEntity();
                    modelEntityContainer.Name = ConvertToModelEntityName(entityContainer);
                    modelEntityContainer.Kind = ModelEntityKind.Container;
                    modelSchema.Entities.Add(modelEntityContainer);
                    var modelEntityContainerTableType = new ModelTableType();
                    modelEntityContainerTableType.Name = ConvertToModelEntityName(entityContainer);
                    modelEntityContainer.TableType     = modelEntityContainerTableType;

                    var elements = entityContainer.Elements;

                    var entitySets = entityContainer.EntitySets();
                    foreach (var entitySet in entitySets)
                    {
                        var modelEntitySet = new ModelEntity();
                        modelEntitySet.Name = ConvertToModelEntityName(entitySet, entityContainer);
                        modelEntitySet.Kind = ModelEntityKind.EntitySet;
                        var elementTypeName = ConvertToModelEntityName(entitySet.ElementType);
                        modelEntitySet.TableType = typeDefinitionsByName.GetValueOrDefault(elementTypeName);
                        modelSchema.Entities.Add(modelEntitySet);
                        entityByName[modelEntitySet.Name] = modelEntitySet;

                        //var property = new ModelProperty();
                        //property.Name = entitySet.Name;
                        //property.Type = new ModelT;

                        //modelEntityContainerTableType.Properties.Add(property);
                        //var modelRelation = new ModelRelation();
                        //modelRelation.Name = entitySet.Name;
                        //modelRelation.Master = modelEntityContainer;
                        //modelRelation.Child = modelEntitySet;
                        //modelSchema.Relations.Add(modelRelation);
                        //   entitySet.ContainerElementKind== EdmContainerElementKind.EntitySet
                        //   entitySet.ContainerElementKind == EdmContainerElementKind.FunctionImport
                    }

                    foreach (var entitySet in entitySets)
                    {
                        var entitySetName  = ConvertToModelEntityName(entitySet, entityContainer);
                        var modelEntitySet = entityByName.GetValueOrDefault(entitySetName);

                        var navigationTargets = entitySet.NavigationTargets;
                        foreach (var navigationTarget in navigationTargets)
                        {
                            var navigationProperty  = navigationTarget.NavigationProperty;
                            var targetEntitySet     = navigationTarget.TargetEntitySet;
                            var targetEntitySetName = targetEntitySet.Name;
                            var dependentProperties = navigationProperty.DependentProperties;
                            var partner             = navigationProperty.Partner;
                            var partnerName         = partner.Name;
                            var modelRelation       = new ModelRelation();
                            modelRelation.Name   = navigationTarget.NavigationProperty.Name;
                            modelRelation.Master = modelEntitySet;
                            modelRelation.Child  = null;
                            //if (targetEntitySet.ElementType is IEdmSchemaElement elementType) {
                            //    modelRelation.Child = entityByName.GetValueOrDefault(ConvertToModelEntityName(elementType));
                            //}
                            modelSchema.Relations.Add(modelRelation);
#warning here
                        }

                        //-		[0]	{Microsoft.Data.Edm.Library.EdmNavigationTargetMapping}	Microsoft.Data.Edm.IEdmNavigationTargetMapping {Microsoft.Data.Edm.Library.EdmNavigationTargetMapping}
                    }
                }
            }


            return(resultErrors);
        }
        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);
        }
Example #6
0
        public ModelComplexType BuildComplexType(EdmxModel edmxModel, ModelSchema modelSchema, CsdlEntityTypeModel entityTypeModel, MetaModelBuilder metaModelBuilder, ModelErrors errors)
        {
            var entityTypeModelName     = entityTypeModel.Name;
            var entityTypeModelFullName = entityTypeModel.FullName;

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

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

            var modelComplexType = metaModelBuilder.CreateModelComplexType(
                entityTypeModelName,
                entityTypeModelFullName,
                errors);

            if (modelComplexType.Owner == null)
            {
                modelSchema.ComplexTypes.Add(modelComplexType);
            }

            foreach (var property in entityTypeModel.Property)
            {
                ModelScalarType modelScalarType = null;
                ModelScalarType suggestedType   = property.SuggestType(metaModelBuilder);

                // TODO: thinkof EdmxModelBuilder Build ScalarType
                //if (property.ScalarType != null) {
                //    property.ScalarType.FullName
                //}

                modelScalarType = metaModelBuilder.CreateModelScalarType(
                    entityTypeModelName,
                    entityTypeModelFullName,
                    property.Name,
                    null,
                    property.TypeName,
                    suggestedType,
                    property.MaxLength,
                    property.FixedLength,
                    property.Nullable,
                    property.Precision,
                    property.Scale,
                    errors
                    );

                var modelProperty = metaModelBuilder.CreateModelProperty(
                    entityTypeModelName,
                    entityTypeModelFullName,
                    property.Name,
                    null,
                    errors
                    );
                if (modelProperty.Type == null)
                {
                    modelProperty.Type = modelScalarType;
                }
                if (modelProperty.Owner == null)
                {
                    modelComplexType.Properties.Add(modelProperty);
                }
            }
            var primaryKey = entityTypeModel.Keys;

            if (primaryKey.Count > 0)
            {
                var modelIndex = metaModelBuilder.CreateModelIndex(
                    entityTypeModelName,
                    entityTypeModelFullName,
                    "PrimaryKey",
                    null,
                    errors
                    );
                modelIndex.IsPrimaryKey = true;
                if (modelIndex.Owner == null)
                {
                    modelComplexType.Indexes.Add(modelIndex);
                }
                foreach (var keyModel in entityTypeModel.Keys)
                {
                    var modelIndexProperty = metaModelBuilder.CreateModelIndexProperty(
                        entityTypeModelName,
                        entityTypeModelFullName,
                        modelIndex.Name,
                        modelIndex.ExternalName,
                        keyModel.Name,
                        null,
                        //keyModel.Property,
                        errors
                        );
                    if (modelIndexProperty.Owner == null)
                    {
                        modelIndex.Properties.Add(modelIndexProperty);
                    }
                }
            }

            return(modelComplexType);
        }
        public void BuildModelSchema(
            ModelSqlDatabase modelDatabase,
            ModelSchema modelSchema,
            MetaModelBuilder metaModelBuilder,
            ModelErrors errors)
        {
            if (modelSchema == null)
            {
                modelSchema = new ModelSchema();
            }
            if (metaModelBuilder == null)
            {
                metaModelBuilder = new MetaModelBuilder();
            }

            // modelDatabase.Freeze();

            foreach (var table in modelDatabase.Tables)
            {
                var entityTypeModelName     = table.Name.GetQFullName(null, 2);
                var entityTypeModelFullName = table.Name.GetQFullName("[", 2);

                var modelComplexType = metaModelBuilder.CreateModelComplexType(
                    entityTypeModelName,
                    entityTypeModelFullName,
                    errors);

                if (modelComplexType.Owner == null)
                {
                    modelSchema.ComplexTypes.Add(modelComplexType);
                }

                foreach (var column in table.Columns)
                {
                    ModelScalarType modelScalarType = null;
                    ModelScalarType suggestedType   = column.SuggestType(metaModelBuilder);

                    modelScalarType = metaModelBuilder.CreateModelScalarType(
                        entityTypeModelName,
                        entityTypeModelFullName,
                        column.Name.GetQName(),
                        null,
                        column.SqlType.Name.GetQFullName(),
                        suggestedType,
                        column.MaxLength,
                        column.FixedLength,
                        column.Nullable,
                        column.Precision,
                        column.Scale,
                        errors
                        );
                    var columnName         = column.Name.GetQFullName(null, 1);
                    var columnExternalName = column.Name.GetQFullName("[", 1);

                    var modelProperty = metaModelBuilder.CreateModelProperty(
                        entityTypeModelName,
                        entityTypeModelFullName,
                        columnName,
                        columnExternalName,
                        errors
                        );
                    if (modelProperty.Type == null)
                    {
                        modelProperty.Type = modelScalarType;
                    }
                    if (modelProperty.Owner == null)
                    {
                        modelComplexType.Properties.Add(modelProperty);
                    }
                }

                var tableIndexes    = table.Indexes.ToList();
                var lstPrimaryIndex = tableIndexes.Where(sqlIndex => sqlIndex.IsPrimaryKey).ToList();
                var primaryIndex    = lstPrimaryIndex.FirstOrDefault();
                if (lstPrimaryIndex.Count == 1)
                {
                    //var sqlIndex = lstPrimaryIndex[0];
                    // OK
                }
                else if (lstPrimaryIndex.Count > 1)
                {
                    errors.AddErrorOrThrow($"More than one ({lstPrimaryIndex.Count}) primary key.", table.NameSql);
                }
                else
                {
#warning think of no primary key
                }

                foreach (var sqlIndex in tableIndexes)
                {
#warning have indexes a schema??
                    var modelIndex = metaModelBuilder.CreateModelIndex(entityTypeModelName, entityTypeModelFullName, sqlIndex.Name.Name, sqlIndex.Name.Name, errors);
                    //modelIndex.IsPrimaryKey = sqlIndex.IsPrimaryKey;
                    modelIndex.IsPrimaryKey = ReferenceEquals(sqlIndex, primaryIndex);
                    modelComplexType.Indexes.Add(modelIndex);
                    foreach (var column in sqlIndex.Columns)
                    {
                        var modelIndexProperty = metaModelBuilder.CreateModelIndexProperty(
                            entityTypeModelName,
                            entityTypeModelFullName,
                            sqlIndex.Name.Name,
                            sqlIndex.Name.Name,
                            column.Name.Name,
                            null,
                            errors
                            );
                        modelIndex.Properties.Add(modelIndexProperty);
                    }
                }
                var entitySetName = table.Name.GetQFullName(null, 2);
                var modelEntity   = metaModelBuilder.CreateModelEntity(
                    entitySetName,
                    ModelEntityKind.EntitySet,
                    errors);
                if (modelEntity.Owner == null)
                {
                    modelSchema.Entities.Add(modelEntity);
                }
                modelEntity.EntityType = modelComplexType;
            }
        }