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); } } } } }
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); } }
private static bool FieldAlreadyModelled(IEnumerable <SqlFieldConfiguration> modelledFields, FieldGraphPath <PropertyField> graphPath) => modelledFields.Any(q => q.PropertyPath.Equals(graphPath));
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); }
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; }
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) { }