Ejemplo n.º 1
0
        public void Apply(BuildContext context, BuildStep buildStep, SqlEntityConfiguration sqlEntityConfiguration,
                          SqlDataModelBuilder sqlDataModelBuilder)
        {
            if (buildStep != BuildStep.DefineFields)
            {
                return;
            }

            sqlDataModelBuilder.ModelledFields.Add(FieldConfiguration);
        }
Ejemplo n.º 2
0
        public DataSchemaBuilder AddSqlEntity(SqlEntityConfiguration entityConfiguration)
        {
            var entityType = entityConfiguration.EntityType;

            if (_sqlEntityConfigurations.ContainsKey(entityType))
            {
                throw new InvalidOperationException("Entity type already registered.");
            }

            _sqlEntityConfigurations.Add(entityType, entityConfiguration);

            return(this);
        }
        public void Apply(BuildContext context, BuildStep buildStep, SqlEntityConfiguration sqlEntityConfiguration,
                          SqlDataModelBuilder sqlDataModelBuilder)
        {
            if (buildStep != BuildStep.DefineRelationships)
            {
                return;
            }

            var typeModel = TypeModel.GetModelOf(sqlEntityConfiguration.EntityType);

            ModelFields(typeModel.Fields, new string[0]);

            void ModelFields(IReadOnlyList <PropertyField> fields, string[] parentPath)
            {
                foreach (var field in fields)
                {
                    var fieldGraphPath = new FieldGraphPath <PropertyField>(
                        parentPath.Concat(new[] { field.FieldName }).ToArray(),
                        field
                        );

                    if (SqlTypeHelper.GetDataType(field.FieldType.Type) == null)
                    {
                        if (!IsRegisteredEntity(context, field.FieldType.Type))
                        {
                            ModelFields(field.FieldModel.Fields, fieldGraphPath.Path);
                        }
                        else
                        {
                            //  build a fk relationship
                            var model           = context.SqlBuilders.First(q => q.EntityType == field.FieldType.Type);
                            var foreignKeyField = model.ModelledFields.FirstOrDefault(q => q.Options.IsPrimaryKey);
                            if (foreignKeyField == null)
                            {
                                throw new Exception("Referenced entity missing primary key field.");
                            }

                            var fieldConfig = SqlFieldConfiguration.Create(field)
                                              .ColumnName($"{string.Join("_", fieldGraphPath.Path)}_{foreignKeyField.Options.ColumnName}")
                                              .DataType(foreignKeyField.Options.SqlDataType)
                                              .IsNullable(true)
                                              .ForeignKey(foreignKeyField.PropertyPath);
                            fieldConfig.PropertyPath = fieldGraphPath;

                            sqlDataModelBuilder.ModelledFields.Add(fieldConfig);
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
 public StorageModelConverter(
     SqlEntityConfiguration sqlEntityConfiguration,
     BuildContext buildContext
     )
 {
     _currentPath            = new List <string>();
     _sqlEntityConfiguration = sqlEntityConfiguration;
     _buildContext           = buildContext;
     _modelStateStack        = new Stack <IModelState>();
     _modelStateStack.Push(new ModelState <TEntity>(
                               buildContext.SqlBuilders.First(q => q.EntityType == typeof(TEntity)),
                               new string[0]
                               ));
 }
Ejemplo n.º 5
0
        public DataSchemaBuilder AddSqlEntity <TEntity>(
            Action <SqlEntityConfiguration <TEntity> > configure = null)
            where TEntity : class
        {
            var entityType = typeof(TEntity);

            if (_sqlEntityConfigurations.ContainsKey(entityType))
            {
                throw new InvalidOperationException("Entity type already registered.");
            }

            var configuration = new SqlEntityConfiguration <TEntity>();

            configure?.Invoke(configuration);
            _sqlEntityConfigurations.Add(entityType, configuration);

            return(this);
        }
Ejemplo n.º 6
0
        public void Apply(BuildContext context, BuildStep buildStep, SqlEntityConfiguration sqlEntityConfiguration,
                          SqlDataModelBuilder sqlDataModelBuilder)
        {
            if (buildStep != BuildStep.DefineFields)
            {
                return;
            }

            var typeModel = TypeModel.GetModelOf(sqlEntityConfiguration.EntityType);

            ModelFields(typeModel.Fields, new string[0]);

            void ModelFields(IReadOnlyList <PropertyField> fields, string[] parentPath)
            {
                foreach (var field in fields)
                {
                    var fieldGraphPath = new FieldGraphPath <PropertyField>(
                        parentPath.Concat(new[] { field.FieldName }).ToArray(),
                        field
                        );

                    if (FieldAlreadyModelled(sqlDataModelBuilder.ModelledFields, fieldGraphPath))
                    {
                        continue;
                    }

                    if (SqlTypeHelper.GetDataType(field.FieldType.Type) == null)
                    {
                        //  not an SQL primitive type, if it's not defined in builder auto-config sub properties
                        if (IsRegisteredEntity(context, field.FieldType.Type))
                        {
                            continue;
                        }

                        ModelFields(field.FieldModel.Fields, fieldGraphPath.Path);
                    }
                    else
                    {
                        sqlDataModelBuilder.ModelledFields.Add(CreateFieldConfiguration(field, fieldGraphPath));
                    }
                }
            }
        }
Ejemplo n.º 7
0
        public static DataSchema CreateSchemaFromDataContextType(Type dataContextType)
        {
            if (dataContextType.IsAbstract)
            {
                throw new InvalidOperationException("Cannot create schema from abstract data context type.");
            }

            var schemaBuilder = new DataSchemaBuilder();

            foreach (var property in dataContextType.GetDataSetProperties())
            {
                if (property.PropertyType.IsGenericType)
                {
                    var genericArgs = property.PropertyType.GetGenericArguments();
                    if (property.PropertyType.IsSqlDataSetWithEntityAndBusinessTypes())
                    {
                        var sqlEntityConfiguration = SqlEntityConfiguration.Create(
                            genericArgs[0], genericArgs[1]);
                        sqlEntityConfiguration.DefaultTableName = property.Name;
                        AutoConfigureEntityType(sqlEntityConfiguration);
                        schemaBuilder.AddSqlEntity(sqlEntityConfiguration);
                    }
                    else if (property.PropertyType.IsSqlDataSetWithEntityType())
                    {
                        var sqlEntityConfiguration = SqlEntityConfiguration.Create(
                            genericArgs[0]);
                        sqlEntityConfiguration.DefaultTableName = property.Name;
                        AutoConfigureEntityType(sqlEntityConfiguration);
                        schemaBuilder.AddSqlEntity(sqlEntityConfiguration);
                    }
                }
            }

            AttemptCallConfigure(dataContextType, schemaBuilder);

            return(schemaBuilder.Build());
        }
Ejemplo n.º 8
0
        public void Apply(BuildContext context, BuildStep buildStep, SqlEntityConfiguration sqlEntityConfiguration,
                          SqlDataModelBuilder sqlDataModelBuilder)
        {
            if (buildStep != BuildStep.DefineFields)
            {
                return;
            }

            if (sqlDataModelBuilder.ModelledFields.Any(q => q.Options.IsPrimaryKey))
            {
                return;
            }

            var idField = sqlDataModelBuilder.ModelledFields.FirstOrDefault(
                q => q.PropertyPath.Path.SequenceEqual(new[] { "Id" })
                );

            if (idField == null)
            {
                return;
            }

            idField.PrimaryKey();
        }
Ejemplo n.º 9
0
 private static void AutoConfigureEntityType(SqlEntityConfiguration entityConfiguration)
 {
 }