将MVC和Entity Framework 6与Code First Migrations一起使用时,开箱即用的EF生成PK约束名称为dbo_TableName。我希望能够将其重命名为“ pkTableColColumn”,我知道EF Core支持此.HasConstraintName("MyFKConstraint");
不幸的是,我不认为EF 6通过fluentAPI或数据注释支持此功能。
我以this amazing post为起点。主要区别在于他们希望其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)
时
我对这个API有点陌生,并且希望获得有关如何获取dropPrimaryKey函数为我提供PK的当前列的任何想法。
一旦解决了所有这些问题,我计划使用类似的过程来重命名FK约束。