以前使用的是 EF 4.3,升级到 5.0 后,我发现索引、FK 约束和 PK 约束都已更改其命名约定以包括 dbo(例如,PK_Users 现在已变为 PK_dbo.Users)
现在,每当我对模型进行更改并且它需要更改包含这些内容的表时,它总是说它不能删除约束,因为它找不到它。
我只是想要它,以便当它尝试删除约束/索引/键时,它首先检查是否存在 5.0 之前的命名,如果存在则删除它,但仍使用新的 5.0 命名约定重新创建它。
命名约定从 4.3 更改为 5.0:
主键/索引
Old: PK_Users New: PK_dbo.Users
外键
Old: FK_Users_Roles_Role_Id New: FK_dbo.Users_dbo.Roles_Role_Id
注意:我不能简单地让 EF 重新生成所有表,我在这个数据库中有生产数据。我也不想使用自定义迁移为每个表手动执行此操作。
编辑:我发现了一个类似的问题How can I stop Entity Framework 5 migrations added dbo. 进入关键名称?但是这个家伙只是想忽略 5.0 的约定并坚持使用 4.3,它只处理表重命名。我不希望这样做,因为 EF 的后续版本可能会导致更多会影响此代码的更改,并且只会带来麻烦。
我尝试按照与发布的答案相同的方式做一些事情:
public class CodeMigrator : CSharpMigrationCodeGenerator
{
protected override void Generate(
DropIndexOperation dropIndexOperation, IndentedTextWriter writer)
{
dropIndexOperation.Name = StripDbo(dropIndexOperation.Name);
base.Generate(dropIndexOperation, writer);
}
protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation, IndentedTextWriter writer)
{
dropForeignKeyOperation.Name = StripDbo(dropForeignKeyOperation.Name);
base.Generate(dropForeignKeyOperation, writer);
}
protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation, IndentedTextWriter writer)
{
dropPrimaryKeyOperation.Name = StripDbo(dropPrimaryKeyOperation.Name);
base.Generate(dropPrimaryKeyOperation, writer);
}
// TODO: Override other Generate overloads that involve table names
private string StripDbo(string name)
{
return name.Replace("dbo.", "");
}
}
并将其添加到配置中:
public Configuration()
{
CodeGenerator = new CodeMigrator();
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
但是错误仍然存在:
dbo.Users_dbo.Departments_Department_Id' 不是约束。无法删除约束。请参阅以前的错误。
我实际上尝试覆盖中的每个成员CSharpMigrationCodeGenerator
并在 return 语句上设置一个断点,但没有一个成功。所以看起来我的自定义生成器从未被使用过,不确定我缺少什么。