2012-09-25 106 views

回答

4

您可以尝试创建自己的MigrationSqlGenerator与迁移使用它(您可以在DbMigrationsConfiguration设置自定义SQL生成器) - 我认为它应该是足够的继承SqlServerMigrationSqlGenerator并添加外键=覆盖Generate(AddForeignKeyIperation operation)之后添加NOCHECK

无论如何,使用NOCHECK与EF是灾难的方式。如果你想拥有没有检查约束的数据库,不要使用EF,因为每次达到不一致时它都会崩溃。

+0

感谢您的回答。我非常了解使用NOCHECK的风险,相关的变化是相当小的,我相信nocheck是我的唯一方法。我将检查MigrationSqlGenerator。 –

3

另一种方式来做到这一点对一次性场合是调用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]"); 
0

如果目标是创建一个要求外国但由于现有数据,更新数据库失败,只需分两步完成。例如,假设我想在PLAYER类中为TEAM添加一个外键,以1:m的关系将所有玩家分配给一个团队。假设所有类都有整数标识主键... 1.将通常的两个属性添加到PLAYER,但使用可为空的int作为外键。即:

public int? TeamID { get; set; } 

    public virtual Team Team { get; set; } 
  • 添加迁移,并更新数据库。所有TeamID值将为空,但您将被允许创建关系。

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

      public int TeamID {get;组; }

    3. 添加另一个迁移并再次更新数据库。你应该很好走。

  • 相关问题