是否可以使用nocheck约束在代码优先迁移中更改表?除了通过Update-Database -Script
获取SQL脚本并修改sql语句之外,我还没有找到任何方法。
答案 0 :(得分:4)
您可以尝试创建自己的MigrationSqlGenerator
并将其用于迁移(您可以在DbMigrationsConfiguration
中设置自定义SQL生成器) - 我认为继承SqlServerMigrationSqlGenerator
并添加{添加外键=覆盖NOCHECK
之后{1}}。
无论如何使用EF Generate(AddForeignKeyIperation operation)
是灾难的方法。如果您希望拥有没有检查约束的数据库,请不要使用EF,因为每次达到不一致时它都会崩溃。
答案 1 :(得分:3)
另一种在一次性场合下执行此操作的方法是从Up()
方法中调用SQL以手动创建FK:
// 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]");
答案 2 :(得分:1)
如果目标是创建所需的外键但由于现有数据而导致update-database失败,则只需分两个阶段即可完成。例如,假设我想在PLAYER类中为TEAM添加外键,以获得1:m的关系,其中所有玩家必须被分配给一个团队。假设所有类都有整数身份主键... 1.将通常的两个属性添加到PLAYER,但对外键使用可为空的int。即:
public int? TeamID { get; set; }
public virtual Team Team { get; set; }
添加迁移并更新数据库。所有TeamID值都将为null,但您将被允许创建关系。
修改PLAYER类,使int不再可为空:
public int TeamID {get;组; }
添加其他迁移并再次更新数据库。你应该好好去。