2016-08-24 39 views
7

我正試圖減少EF 6x數據存儲測試的啓動時間。測試在一個事務中,一旦完成,數據庫就會回滾。如果在測試會話之間如何保留DbContext的實例,我將不勝感激,以便EF不必再次完成整個視圖生成過程?在測試過程中提高實體框架性能

我不想使用嘲笑/贗品,EF的非微軟分支和交互式視圖已經到位。謝謝。

+5

您將不得不提供一些代碼和更多關於您在做什麼的細節,我的意思是這個測試項目是如何設置的。你有多個DbContext實例嗎?每個測試一個?每班一個?全球一個?你必須說明初始化很慢,因此它給我們提供瞭解如何解決它的方法。 – Igor

+0

在實踐中,DbContext應該非常輕量級。例如。在Web應用程序中,每個用戶請求都有一個這樣的實例。他們確實是(或者至少應該是)輕量級對象。因此,您遇到的性能問題可能來自其他地方。也許DbInitializer爲你的測試呢?你分析了你的代碼嗎?也許我錯了,雖然... –

+0

你不應該保留一個DbContext實例,並在不同的測試會話中重用它。這與重用DbContext沒有什麼不同,比如在不同的線程中。這是不好的做法(不是線程安全的)。 –

回答

0

我想推薦您使用in-memory data。我也使用這種模式,它非常好,非常快。這是行業推薦並長期無故障的模式。開發軟件應用程序時,請始終嘗試使用最佳做法。

當爲您的應用程序編寫測試時,通常需要避免使用 命中數據庫。實體框架允許您通過 創建上下文 - 通過您的測試定義的行爲 - 實現 使用in-memory數據。

這裏是如何做到這一點的文章:Testing with a mocking framework

的另一篇文章對您:Unit testing in C# using xUnit, Entity Framework, Effort and ASP.NET Boilerplate

+0

謝謝,但我想要一個更快的方式使用真正的交易 – Vas

+0

這不是一個推薦的測試方式。長期來說你會遇到很大的麻煩。 – Sampath

+1

@Sampath爲什麼不推薦?因爲它更慢或?你真的用假提供程序測試 - 一個完美運行的LINQ to Objects查詢,在LINQ to Entities的運行時拋出不支持的異常? –

1

不同的選擇。當你沒有提到你的測試的目的並沒有任何代碼,選項有:

  1. 如果要插入多條記錄到表中,你可以做一個批量插入。最好的圖書館是:EntityFramework.BulkInsert-ef6。您可以通過Nuget控制檯進行安裝。

  2. 如果在處理數據時看到緩慢並且您有許多加載/操作/保存操作,則必須按照Sampath建議的方法進行內存中操作。

  3. 如果您要加載數據,只需加載所需的列。你也應該使用懶加載選項(從你的文章中,我認爲你很清楚)。

4.緩慢的部分原因可能是由於數據庫的體系結構。關鍵列類型對Where操作有相當大的影響!

+0

感謝您的回覆。問題是關於在測試會話之間保留相同的DbContext運行實例。謝謝。 – Vas