Rom*_*syk 12 c# entity-framework naming-conventions code-first
我们有自己的命名对象的外部约定,我需要更改自动生成的外键约束的命名约定.现在它看起来像:FK_dbo.City_dbo.CityType_City_CityTypeId
但我希望它被称为City_FKC_CityType
.
我发现了一个类似的问题,说你可以手动更改约束的名称.但是,这不适合我,因为我有很多表和外键约束.
我找到了一些关于"自定义代码优先约定"的信息,我想知道我是否可以使用此更改约束的名称,或者是否有任何方法来实现它?
另一个变体是下载EF的源代码,进行更改并使用它,但是在紧急情况下.
作为旁注,我还想更改主键的命名约定.
您可以实现SqlServerMigrationSqlGenerator
从System.Data.Entity.SqlServer
命名空间派生的自定义sql生成器类:
public class CustomSqlGenerator : SqlServerMigrationSqlGenerator
{
protected override void Generate(AddForeignKeyOperation addForeignKeyOperation)
{
addForeignKeyOperation.Name = getFkName(addForeignKeyOperation.PrincipalTable,
addForeignKeyOperation.DependentTable, addForeignKeyOperation.DependentColumns.ToArray());
base.Generate(addForeignKeyOperation);
}
protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation)
{
dropForeignKeyOperation.Name = getFkName(dropForeignKeyOperation.PrincipalTable,
dropForeignKeyOperation.DependentTable, dropForeignKeyOperation.DependentColumns.ToArray());
base.Generate(dropForeignKeyOperation);
}
private static string getFkName(string primaryKeyTable, string foreignKeyTable, params string[] foreignTableFields)
{
// Return any format you need
}
}
Run Code Online (Sandbox Code Playgroud)
然后你需要注册你的发电机DbContext
使用DbConfiguration
:
public class CustomDbConfiguration : DbConfiguration
{
public CustomDbConfiguration()
{
SetMigrationSqlGenerator(SqlProviderServices.ProviderInvariantName,
() => new CustomSqlGenerator());
}
}
Run Code Online (Sandbox Code Playgroud)
而且DbConfigurationTypeAttribute
:
[DbConfigurationType(typeof(CustomDbConfiguration))]
public class YourEntities : DbContext
Run Code Online (Sandbox Code Playgroud)
更新:如果要更改主键名称,则需要覆盖以下Generate
方法:
protected override void Generate(CreateTableOperation createTableOperation)
{
createTableOperation.PrimaryKey.Name = getPkName(createTableOperation.Name);
base.Generate(createTableOperation);
}
protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation)
{
addPrimaryKeyOperation.Name = getPkName(addPrimaryKeyOperation.Table);
base.Generate(addPrimaryKeyOperation);
}
protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation)
{
dropPrimaryKeyOperation.Name = getPkName(dropPrimaryKeyOperation.Table);
base.Generate(dropPrimaryKeyOperation);
}
Run Code Online (Sandbox Code Playgroud)