Как я могу автоматически применять пользовательские соглашения о именовании для PK, FK, индекса, последовательности и знC#

Место общения программистов C#
Ответить
Anonymous
 Как я могу автоматически применять пользовательские соглашения о именовании для PK, FK, индекса, последовательности и зн

Сообщение Anonymous »

Я использую Forever Framework Core и хочу автоматически обеспечить индивидуальные соглашения именования для PK, FK, индексов и последовательностей. (FK): fk_parent_child_joined_columns < /code>
  • PARENT: таблица ссылок (ребенок)
  • CHILD: таблица ссылки (родитель)
  • JOINED_COLUMNS< /code>: короткая конкатенация соединенных имен столбцов < /li>
    < /ul>
    < /li>
    index: idx_table_name_column_shortcut < /code>

    Если множественные столбцы, с соблюдением их имени < /li>
    , если нельзя, чтобы начать, то есть уникальное, что именем < /li>

    . ux _ < /code> < /li>
    < /ul>
    < /li>
    Последовательность: (аналогичные правила, если используются последовательности) < /li>
    < /ul>
    Soft Delete /Active < /code> flag: < /p>


    < /ul>
    Другими словами, потому что мой код расширения не работал идеально, имена, сгенерированные в миграциях, не соответствовали предполагаемым правилам или объектам базы данных. < /p>
    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>
    Пример вывода миграции: < /p>
    migrationBuilder.CreateIndex(
    name: "idx_Order_OrderId",
    table: "Order",
    column: "OrderId");
    < /code>
    Но я ожидал: < /p>
    migrationBuilder.CreateIndex(
    name: "idx_orders_order_id",
    table: "orders",
    column: "order_id");


    Подробнее здесь: https://stackoverflow.com/questions/797 ... ndex-seque
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»