- 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 kolonuna default true atama
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
Как я могу автоматически применять пользовательские соглашения о именовании для PK, FK, индекса, последовательности и зн ⇐ C#
-
Anonymous
Как я могу автоматически применять пользовательские соглашения о именовании для PK, FK, индекса, последовательности и зн
Я использую Forever Framework Core и хочу автоматически обеспечить индивидуальные соглашения именования для PK, FK, индексов и последовательностей. (FK): fk_parent_child_joined_columns < /code>
Мобильная версия