- : Referenzierungstabelle (Kind)
Code: Select all
PARENT - : Referenzierte Tabelle (übergeordnet)
Code: Select all
CHILD Code: Select all
JOINED_COLUMNS< /code>: Eine kurze Verkettung der angeschlossenen Spaltennamen < /li> < /ul> < /li> Index: IDX_TABLE_NAME_COLUMN_SHORTCUT < /code> Wenn mehrere Kolumnen zu starten, werden die Namen. ux_
Soft delete / Active flag:
- : Alle Tabellen haben eine is_active Spalte mit einem Standardwert von 1
Code: Select all
is_active - Diese Spalte gibt an, ob eine Zeile aktiv ist (1) oder logisch deletiert (0)
Mit anderen Worten, da mein Erweiterungscode nicht perfekt funktioniert, übereinstimmte die in den Migrationen generierten Namen nicht mit den beabsichtigten Regeln oder den Datenbankobjekten. < /p>
Code: Select all
public static class ModelBuilderExtensions
{
public static void ApplyConventions(this ModelBuilder modelBuilder)
{
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
var tableName = entity.GetTableName().ToLowerInvariant();
// 1. PK
var pk = entity.FindPrimaryKey();
if (pk != null)
{
pk.SetName($"pk_{tableName}");
}
// 2. FK
foreach (var fk in entity.GetForeignKeys())
{
var fkName = $"fk_{tableName}_{fk.PrincipalEntityType.GetTableName().ToLowerInvariant()}_{string.Join("_", fk.Properties.Select(p => p.GetColumnName().ToLowerInvariant()))}";
fk.SetConstraintName(fkName);
fk.DeleteBehavior = DeleteBehavior.Restrict;
}
// 3. Index (idx / ux)
foreach (var index in entity.GetIndexes())
{
var prefix = index.IsUnique ? "ux" : "idx";
var indexName = $"{prefix}_{tableName}_{string.Join("_", index.Properties.Select(p => p.GetColumnName().ToLowerInvariant()))}";
index.SetDatabaseName(indexName);
}
// 4. is_active default true
var isActiveProp = entity.FindProperty("IsActive");
if (isActiveProp != null)
{
isActiveProp.SetDefaultValue(true);
}
}
}
}
< /code>
AppDBContext: < /p>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
// ModelBuilderExtensions (PK, FK, Index, Comment, Cascade)
modelBuilder.ApplyConventions();
base.OnModelCreating(modelBuilder);
}
< /code>
Beispiel Migrationsausgabe: < /p>
migrationBuilder.CreateIndex(
name: "idx_Order_OrderId",
table: "Order",
column: "OrderId");
< /code>
Aber ich habe erwartet: < /p>
migrationBuilder.CreateIndex(
name: "idx_orders_order_id",
table: "orders",
column: "order_id");
Mobile version