是否有可能在使用nocheck約束的代碼優先遷移中更改表?除了通過Update-Database -Script
獲取SQL腳本並修改sql語句之外,我還沒有找到任何方法來執行此操作。實體框架代碼優先遷移NOCHECK約束?
1
A
回答
4
您可以嘗試創建自己的MigrationSqlGenerator
與遷移使用它(您可以在DbMigrationsConfiguration
設置自定義SQL生成器) - 我認爲它應該是足夠的繼承SqlServerMigrationSqlGenerator
並添加外鍵=覆蓋Generate(AddForeignKeyIperation operation)
之後添加NOCHECK
。
無論如何,使用NOCHECK
與EF是災難的方式。如果你想擁有沒有檢查約束的數據庫,不要使用EF,因爲每次達到不一致時它都會崩潰。
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值將爲空,但您將被允許創建關係。
- 接下來,修正您的數據,以便爲每個玩家分配一個有效的TeamID。如果您正在播放玩家數據,則還需要在那裏提供TeamID值。
修改PLAYER類,使int不再爲空:
public int TeamID {get;組; }
添加另一個遷移並再次更新數據庫。你應該很好走。
相關問題
- 1. 實體框架 - 代碼優先遷移:現有約束條件
- 2. 調試代碼優先實體框架遷移代碼
- 3. 實體框架代碼優先一對一約束衝突
- 4. 創建與實體框架代碼優先約束或鍵ApplicationUser
- 5. 實體框架中的唯一鍵約束代碼優先
- 6. 用實體框架代碼優先定義外鍵約束
- 7. 從LINQ到SQL到實體框架的遷移「代碼優先」
- 8. 使用代碼優先遷移和實體框架
- 9. 實體框架代碼優先自動模式遷移
- 10. 代碼優先遷移實體框架種子錯誤
- 11. 實體框架代碼優先 - Firebird遷移:否MigrationSqlGenerator?
- 12. 實體框架代碼優先遷移錯誤
- 13. 實體框架代碼優先:啓用的遷移錯誤
- 14. 實體框架5代碼優先遷移準備生產?
- 15. 實體框架代碼優先遷移的例外
- 16. 合併多個遷移實體框架代碼優先
- 17. 實體框架代碼首先遷移和數據遷移
- 18. 無法遷移實體框架中的AspNetUser實體.NET代碼優先方法
- 19. 實體框架代碼優先 - 初始代碼遷移不起作用
- 20. 實體框架建模代碼優先
- 21. 實體框架代碼優先使用
- 22. 實體框架代碼優先映射
- 23. 實體框架,代碼優先和datetimes
- 24. 與實體框架代碼優先
- 25. 在實體框架代碼優先4.1
- 26. 映射實體框架「代碼優先」
- 27. 實體框架代碼優先 - 界面
- 28. 實體框架 - 代碼優先Fluent API:ErrorMessage?
- 29. 實體框架代碼優先的NullReferenceException
- 30. 實體框架 - 代碼優先方法
感謝您的回答。我非常瞭解使用NOCHECK的風險,相關的變化是相當小的,我相信nocheck是我的唯一方法。我將檢查MigrationSqlGenerator。 –