是否可以在没有检查约束的代码优先迁移中更改表?Update-Database -Script
除了通过获取 SQL 脚本和修改 sql 语句之外,我还没有找到任何方法来做到这一点。
3 回答
您可以尝试创建自己的MigrationSqlGenerator
并将其与迁移一起使用(您可以在 中设置自定义 SQL 生成器) - 我认为在添加外键 = 覆盖后继承和添加DbMigrationsConfiguration
应该足够了。SqlServerMigrationSqlGenerator
NOCHECK
Generate(AddForeignKeyIperation operation)
无论如何NOCHECK
与EF一起使用是灾难的方式。如果您想拥有没有检查约束的数据库,请不要使用 EF,因为每次达到不一致时它都会崩溃。
在一次性情况下执行此操作的另一种方法是调用 SQL 以手动创建 FK,就像这样,从您的Up()
方法中:
// AddForeignKey("dbo.EFElementGroupEntries", "ConstraintCode", "dbo.EFElementConstraints", "Code");
Sql(@"ALTER TABLE [dbo].[EFElementGroupEntries] WITH NOCHECK
ADD CONSTRAINT[FK_dbo.EFElementGroupEntries_dbo.EFElementConstraints_ConstraintCode] FOREIGN KEY([ConstraintCode])
REFERENCES[dbo].[EFElementConstraints]([Code])");
Sql(@"ALTER TABLE [dbo].[EFElementGroupEntries] CHECK CONSTRAINT [FK_dbo.EFElementGroupEntries_dbo.EFElementConstraints_ConstraintCode]");
如果目标是创建所需的外键,但更新数据库由于现有数据而失败,只需分两个阶段进行。例如,假设我想在 PLAYER 类中为 TEAM 添加一个外键,以实现 1:m 关系,其中必须将所有玩家分配到一个团队。假设所有类都有整数标识主键... 1. 将通常的两个属性添加到 PLAYER,但使用可为空的 int 作为外键。IE:
public int? TeamID { get; set; }
public virtual Team Team { get; set; }
添加迁移并更新数据库。所有 TeamID 值都将为空,但您可以创建关系。
- 接下来,修复您的数据,以便为每个玩家分配一个有效的 TeamID。如果您正在播种球员数据,您还需要在此处提供 TeamID 值。
修改 PLAYER 类,使 int 不再可以为空:
公共 int TeamID { 获取;放; }
添加另一个迁移并再次更新数据库。你应该很高兴。