在Effort中強制使用外鍵引用


我在Visual Studio和C#中使用Effort來重新創建和單元測試數據庫。我正在為一個表編寫一個類,所以我只使用該表中的對象填充數據庫。我的問題是Effort數據庫希望對象的外鍵引用數據庫中的實際對象。

我的錯誤是

System.Data.Entity.Infrastructure.DbUpdateException:更新條目時發生錯誤。有關詳細信息,請參閱內部異常

System.Data.Entity.Core.UpdateException:更新條目時發生錯誤。有關詳細信息,請參閱內部異常

System.Reflection.TargetInvocationException:調用目標拋出了異常。

NMemory.Exceptions.ForeignKeyViolationException:外鍵違規[Table1 :: SettingsId]。引用的表[Table2 :: SettingsId]中不存在鍵值[0]。錯誤代碼:RelationError

由於此特定表具有許多具有許多其他外鍵的對象的外鍵,因此需要大量工作。有沒有辦法在努力將其關閉以便我可以單獨測試這張桌子?

一般承認的答案

我也遇到了這個問題,並希望在更大的數據庫範圍內測試該表。您可以創建一個輔助方法,它只是實例化您需要的所有內容,並將結果傳遞給數據庫或表。這有幫助,因為您可以從您需要的任何測試方法/類中隨時調用它。


熱門答案

您可以從數據庫中創建一個新的.edmx文件,僅供測試使用。例如:

在Visual Studio中,選擇File-> New-> Data-> Entity DataModel。從數據庫中選擇“EF Designer”。選擇或創建與現有SQL Server數據庫的連接,並將app.config中的連接設置保存為“testConnectionString”。

在數據模型設計器中,刪除不需要的任何外鍵關係。保存設計器並重建項目。

在Effort中,將連接字符串的名稱(在創建新的.edmx時生成)傳遞給CreateTransient方法,如下所示:

EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");

MyDbContext context = new MyDbContext(connection);

這應該允許您將值插入表中,而無需填充相關的外鍵表。

但是,這會帶來警告 - 如果您正在測試的代碼使用依賴於外鍵的任何導航屬性,則它將失敗。這讓我想知道這種“單元測試”到底有多麼寶貴。





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因