Example #1
0
 protected SqlStorageField(DataType fieldType, string fieldName, bool canWrite, bool canRead,
                           bool isServerGenerated, string columnName, bool isPrimaryKey, FieldGraphPath <PropertyField> typeModelGraphPath)
 {
     FieldType          = fieldType;
     FieldName          = fieldName;
     CanWrite           = canWrite;
     CanRead            = canRead;
     IsServerGenerated  = isServerGenerated;
     ColumnName         = columnName;
     TypeModelGraphPath = typeModelGraphPath;
     IsPrimaryKey       = isPrimaryKey;
 }
        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);
                        }
                    }
                }
            }
        }
Example #3
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));
                    }
                }
            }
        }
        private ModelFieldBindingSource <PropertyField> ResolveSourceField(
            SqlEntityModel <TEntity> sourceModel,
            FieldGraphPath <PropertyField> graphPath
            )
        {
            return(Search(sourceModel.Fields, new string[0]));

            ModelFieldBindingSource <PropertyField> Search(
                IEnumerable <SqlEntityField <TEntity> > fields,
                string[] parentPath
                )
            {
                foreach (var field in fields)
                {
                    var fieldPath = parentPath.Concat(new[] { field.FieldName }).ToArray();

                    if (field.TypeModelGraphPath.Equals(graphPath))
                    {
                        return(new ModelFieldBindingSource <PropertyField>(
                                   fieldPath, field
                                   ));
                    }

                    if (field.FieldModel != null && field.FieldModel.Fields.Count > 0)
                    {
                        var subSearchResult = Search(field.FieldModel.Fields, fieldPath);
                        if (subSearchResult != null)
                        {
                            return(subSearchResult);
                        }
                    }
                }

                return(null);
            }
        }
Example #5
0
 private static bool FieldAlreadyModelled(IEnumerable <SqlFieldConfiguration> modelledFields, FieldGraphPath <PropertyField> graphPath)
 => modelledFields.Any(q => q.PropertyPath.Equals(graphPath));
Example #6
0
        private static SqlFieldConfiguration CreateFieldConfiguration(PropertyField field, FieldGraphPath <PropertyField> graphPath)
        {
            var fieldConfig = SqlFieldConfiguration.Create(field)
                              .ColumnName(string.Join("_", graphPath.Path))
                              .DataType(SqlTypeHelper.GetDataType(field.FieldType.Type))
                              .IsNullable(SqlTypeHelper.TypeIsNullable(field.FieldType.Type));

            fieldConfig.PropertyPath = graphPath;
            return(fieldConfig);
        }
 public SqlFieldConfiguration ForeignKey(FieldGraphPath <PropertyField> foreignKeyFieldPath)
 {
     Options.IsForeignKey        = true;
     Options.ForeignKeyFieldPath = foreignKeyFieldPath;
     return(this);
 }
Example #8
0
 public ForeignSqlStorageField(string fieldName, bool canWrite, bool canRead, bool isServerGenerated,
                               string columnName, Func <TValue> defaultValue, bool isPrimaryKey, FieldGraphPath <PropertyField> typeModelGraphPath,
                               JoinSpecification <TLocalEntity> joinSpecification) :
     base(fieldName, canWrite, canRead, isServerGenerated, columnName, defaultValue, isPrimaryKey, typeModelGraphPath)
 {
     JoinSpecification = joinSpecification;
 }
Example #9
0
 public ForeignKeySqlStorageField(string fieldName, bool canWrite, bool canRead, bool isServerGenerated, string columnName, Func <TValue> defaultValue, bool isPrimaryKey, FieldGraphPath <PropertyField> typeModelGraphPath) :
     base(fieldName, canWrite, canRead, isServerGenerated, columnName, defaultValue, isPrimaryKey, typeModelGraphPath)
 {
 }