C# 实体框架6自定义DBConfiguration PK约束名称生成器
使用MVC和实体框架6以及代码优先迁移,EF开箱即用生成PK约束名称作为dbo_TableName。我希望能够将它们重命名为“pkTableColColColumn”,我知道EF Core支持这个C# 实体框架6自定义DBConfiguration PK约束名称生成器,c#,sql-server,entity-framework,entity-framework-6,ef-code-first,C#,Sql Server,Entity Framework,Entity Framework 6,Ef Code First,使用MVC和实体框架6以及代码优先迁移,EF开箱即用生成PK约束名称作为dbo_TableName。我希望能够将它们重命名为“pkTableColColColumn”,我知道EF Core支持这个。HasConstraintName(“MyFKConstraint”) 不幸的是,我不认为EF6通过fluentAPI或数据注释支持这一点 我把它作为一个起点。主要区别在于,他们希望自己的PK约束名称为“PKTable”,我希望我的名称为“PK[Table]Col[ColumnName]” 对PKNa
。HasConstraintName(“MyFKConstraint”)代码>
不幸的是,我不认为EF6通过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;
}
}
公共类PKNameGenerator:SqlServerMigrationSqlGenerator
{
静态只读字符串PREFIX=“pk”//带有pk的前缀
//这是因为Columns属性在此上下文中存在
受保护的覆盖无效生成(CreateTableOperation CreateTableOperation)
{
createTableOperation.PrimaryKey.Name=GetPkName(createTableOperation.Name,createTableOperation.PrimaryKey.Columns);
生成(createTableOperation);
}
//这是因为Columns属性在此上下文中存在
受保护的覆盖无效生成(AddPrimaryKeyOperation AddPrimaryKeyOperation)
{
addPrimaryKeyOperation.Name=GetPkName(addPrimaryKeyOperation.Table,addPrimaryKeyOperation.Columns);
生成(addPrimaryKeyOperation);
}
//此选项不起作用,因为此上下文中不存在Columns属性
受保护的覆盖无效生成(DropPrimaryKeyOperation DropPrimaryKeyOperation)
{
dropPrimaryKeyOperation.Name=GetPkName(dropPrimaryKeyOperation.Table,dropPrimaryKeyOperation.Columns);
生成(dropPrimaryKeyOperation);
}
//前缀+TableName+“Col”+ColumnName+和+ColumnName(仅适用于复合PKs)
字符串GetPkName(字符串表名,IList列)
{
字符串columnName=“”;
如果(columns.Count>1)
{
columnname=string.Join(“And”,columns.Select(c=>c.ToArray());
}
其他的
{
ColumnName=列[0];
}
返回前缀+tableName.Substring(tableName.IndexOf('.')+1)+“Col”+columnname;
}
}
当添加具有PK甚至复合PK的新表时(这将导致PKTableColumnAndColumn)。我遇到的唯一问题是当我更改主键时,它将调用受保护的重写void Generate(DropPrimaryKeyOperation DropPrimaryKeyOperation)
createTableOperation和addPrimaryKeyOperation的其他重写函数都填充了相应的Columns对象。但是,dropPrimaryKeyOperation没有Columns对象
我对这个API有点陌生,如果您能告诉我如何让dropPrimaryKey函数为我提供当前的PK列,我将不胜感激
一旦我把这些都整理好,我计划使用类似的过程来重命名FK约束