public DataSchema Build() { var sqlDataModels = new List <SqlDataModel>(); var buildCtx = new BuildContext(); foreach (var kvp in _sqlEntityConfigurations) { buildCtx.SqlBuilders.Add( SqlDataModelBuilder.Create(kvp.Key, this, kvp.Value) ); } foreach (var builder in buildCtx.SqlBuilders) { builder.DefineModelFields(buildCtx); } foreach (var builder in buildCtx.SqlBuilders) { builder.DefineRelationshipFields(buildCtx); } foreach (var builder in buildCtx.SqlBuilders) { sqlDataModels.Add(builder.Build(buildCtx)); } return(new DataSchema( new SqlSchema(sqlDataModels, _sqlMethodCallConverters) )); }
public void Apply(BuildContext context, BuildStep buildStep, SqlEntityConfiguration sqlEntityConfiguration, SqlDataModelBuilder sqlDataModelBuilder) { if (buildStep != BuildStep.DefineFields) { return; } sqlDataModelBuilder.ModelledFields.Add(FieldConfiguration); }
public ModelState(SqlDataModelBuilder modelBuilder, IReadOnlyList <string> basePath, SqlStorageField <TEntity> foreignKeyField) { SqlFieldConfigurations = modelBuilder.ModelledFields; BasePath = basePath; JoinSpecification = new JoinSpecification <TEntity>(foreignKeyField.JoinSpecification, typeof(T), $"_{string.Join("_", basePath)}", new JoinColumnPair( foreignKeyField.ColumnName, SqlFieldConfigurations.First(q => q.Options.IsPrimaryKey).Options.ColumnName )); }
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)); } } } }
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(); }
public ModelState(SqlDataModelBuilder modelBuilder, IReadOnlyList <string> basePath) { SqlFieldConfigurations = modelBuilder.ModelledFields; BasePath = basePath; JoinSpecification = null; }