实体框架代码优先迁移NOCHECK约束?

时间:2012-09-25 08:16:13

标签: asp.net-mvc entity-framework ef-migrations

是否可以使用nocheck约束在代码优先迁移中更改表?除了通过Update-Database -Script获取SQL脚本并修改sql语句之外,我还没有找到任何方法。

3 个答案:

答案 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; }
  1. 添加迁移并更新数据库。所有TeamID值都将为null,但您将被允许创建关系。

    1. 接下来,修复您的数据,以便为每位玩家分配一个有效的TeamID。如果您播种播放器数据,则还需要在那里提供TeamID值。
    2. 修改PLAYER类,使int不再可为空:

      public int TeamID {get;组; }

    3. 添加其他迁移并再次更新数据库。你应该好好去。