我正試圖減少EF 6x數據存儲測試的啓動時間。測試在一個事務中,一旦完成,數據庫就會回滾。如果在測試會話之間如何保留DbContext的實例,我將不勝感激,以便EF不必再次完成整個視圖生成過程?在測試過程中提高實體框架性能
我不想使用嘲笑/贗品,EF的非微軟分支和交互式視圖已經到位。謝謝。
我正試圖減少EF 6x數據存儲測試的啓動時間。測試在一個事務中,一旦完成,數據庫就會回滾。如果在測試會話之間如何保留DbContext的實例,我將不勝感激,以便EF不必再次完成整個視圖生成過程?在測試過程中提高實體框架性能
我不想使用嘲笑/贗品,EF的非微軟分支和交互式視圖已經到位。謝謝。
我想推薦您使用in-memory data
。我也使用這種模式,它非常好,非常快。這是行業推薦並長期無故障的模式。開發軟件應用程序時,請始終嘗試使用最佳做法。
當爲您的應用程序編寫測試時,通常需要避免使用 命中數據庫。實體框架允許您通過 創建上下文 - 通過您的測試定義的行爲 - 實現 使用
in-memory
數據。
這裏是如何做到這一點的文章:Testing with a mocking framework
的另一篇文章對您:Unit testing in C# using xUnit, Entity Framework, Effort and ASP.NET Boilerplate
不同的選擇。當你沒有提到你的測試的目的並沒有任何代碼,選項有:
如果要插入多條記錄到表中,你可以做一個批量插入。最好的圖書館是:EntityFramework.BulkInsert-ef6。您可以通過Nuget控制檯進行安裝。
如果在處理數據時看到緩慢並且您有許多加載/操作/保存操作,則必須按照Sampath建議的方法進行內存中操作。
如果您要加載數據,只需加載所需的列。你也應該使用懶加載選項(從你的文章中,我認爲你很清楚)。
4.緩慢的部分原因可能是由於數據庫的體系結構。關鍵列類型對Where操作有相當大的影響!
感謝您的回覆。問題是關於在測試會話之間保留相同的DbContext運行實例。謝謝。 – Vas
您將不得不提供一些代碼和更多關於您在做什麼的細節,我的意思是這個測試項目是如何設置的。你有多個DbContext實例嗎?每個測試一個?每班一個?全球一個?你必須說明初始化很慢,因此它給我們提供瞭解如何解決它的方法。 – Igor
在實踐中,DbContext應該非常輕量級。例如。在Web應用程序中,每個用戶請求都有一個這樣的實例。他們確實是(或者至少應該是)輕量級對象。因此,您遇到的性能問題可能來自其他地方。也許DbInitializer爲你的測試呢?你分析了你的代碼嗎?也許我錯了,雖然... –
你不應該保留一個DbContext實例,並在不同的測試會話中重用它。這與重用DbContext沒有什麼不同,比如在不同的線程中。這是不好的做法(不是線程安全的)。 –