2012-09-25 181 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. 添加另一個遷移並再次更新數據庫。你應該很好走。

  • 相關問題