Wie kann ich automatisch benutzerdefinierte Namenskonventionen für PK-, FK-, Index-, Sequenz- und Standardspaltenwerte iC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich automatisch benutzerdefinierte Namenskonventionen für PK-, FK-, Index-, Sequenz- und Standardspaltenwerte i

Post by Anonymous »

Ich verwende entity Framework -Kern und möchte benutzerdefinierte Namenskonventionen automatisch für PKs, FKs, Indizes und Sequenzen während der Migrationen durchsetzen. (FK): fk_parent_child_joined_columns < /code>
  • Code: Select all

    PARENT
    : Referenzierungstabelle (Kind)
  • Code: Select all

    CHILD
    : Referenzierte Tabelle (übergeordnet)
  • 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_
[*]Sequence: (similar rules if sequences are used)

Soft delete / Active flag:
  • Code: Select all

    is_active
    : Alle Tabellen haben eine is_active Spalte mit einem Standardwert von 1
  • Diese Spalte gibt an, ob eine Zeile aktiv ist (1) oder logisch deletiert (0)
Ich möchte eine allgemeine Erweiterung erstellen, die diese Konventionen für alle Einsteiger für alle Einstände anwenden. Wie kann ich eine solche Lösung effizient implementieren? Fks und Indizes würden automatisch gemäß den Regeln generiert, wobei die Tabelle und die Spaltennamen korrekt verwendet werden. /> < /ul>
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");

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post