Используя MVC и Entity Framework 6 с миграциями кода, EF из коробки генерирует имена ограничений PK как dbo_TableName. Я хочу иметь возможность переименовать их в «pkTableColColumn». Мне известно, что EF Core поддерживает это .HasConstraintName("MyFKConstraint");
К сожалению, я не думаю, что EF 6 поддерживает это с помощью fluentAPI или аннотаций данных.
Я упомянул этот удивительный пост в качестве отправной точки. Основное отличие состоит в том, что они хотели, чтобы их имена ограничений PK были «PKTable», где я хотел бы, чтобы мои имена назывались «pk [Table] Col [ColumnName]».
С небольшим изменением класса PKNameGenerator мой закончился следующим образом:
public class PKNameGenerator : SqlServerMigrationSqlGenerator
{
static readonly string PREFIX = "pk"; // prefix with pk
// this one works as the Columns property exists in this context
protected override void Generate(CreateTableOperation createTableOperation)
{
createTableOperation.PrimaryKey.Name = GetPkName(createTableOperation.Name, createTableOperation.PrimaryKey.Columns);
base.Generate(createTableOperation);
}
// this one works as the Columns property exists in this context
protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation)
{
addPrimaryKeyOperation.Name = GetPkName(addPrimaryKeyOperation.Table, addPrimaryKeyOperation.Columns);
base.Generate(addPrimaryKeyOperation);
}
// this one does not work as the Columns property does not exist in this context
protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation)
{
dropPrimaryKeyOperation.Name = GetPkName(dropPrimaryKeyOperation.Table, dropPrimaryKeyOperation.Columns);
base.Generate(dropPrimaryKeyOperation);
}
// Prefix + TableName + "Col" + ColumnName + And + ColumnName (and only applies with composite PKs)
string GetPkName(string tableName, IList<string> columns)
{
string columnNaming = "";
if (columns.Count > 1)
{
columnNaming = string.Join("And", columns.Select(c => c).ToArray());
}
else
{
columnNaming = columns[0];
}
return PREFIX + tableName.Substring(tableName.IndexOf('.') + 1) + "Col" + columnNaming;
}
}
Это отлично работало при добавлении новой таблицы с PK или даже составным PK (что приведет к в pkTableColColumnAndColumn. Единственная проблема, с которой я столкнулся, заключалась в том, чтобы изменить первичный ключ и вызвать его protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation)
Обе другие функции переопределения для createTableOperation и addPrimaryKeyOperation заполнены соответствующими объектами Columns. Однако dropPrimaryKeyOperation не имеет объекта столбцов .
Я немного новичок в этом API и буду признателен за любые идеи о том, как получить функцию dropPrimaryKey, чтобы получить текущие столбцы, которые являются PK.
Как только я получу все это отсортировано Я планирую использовать аналогичный процесс для переименования ограничений FK.