我有很多測驗類,每個類都有幾十個測驗。我想分離的測驗,所以不是一個大型的情況下MyDbContext,我用MyDbContextToTestFoo,MyDbContextToTestBar,MyDbContextToTestBaz等,所以我有很多DbContext子類。
在我使用 EF Core 5 的單元測驗中,我遇到了ManyServiceProvidersCreatedWarning. 它們單獨作業,但許多在作為一個組運行時失敗:
System.InvalidOperationException:生成警告“Microsoft.EntityFrameworkCore.Infrastructure.ManyServiceProvidersCreatedWarning”的錯誤:已創建超過 20 個“IServiceProvider”實體供物體框架內部使用。這通常是由將新的單例服務實體注入每個 DbContext 實體引起的。例如,每次呼叫“UseLoggerFactory”都會傳入一個新實體——參見https://go.microsoft.com/fwlink/?linkid=869049更多細節。這可能會導致性能問題,請考慮查看可能需要構建新服務提供程式的“DbContextOptionsBuilder”呼叫。可以通過將事件 ID 'CoreEventId.ManyServiceProvidersCreatedWarning' 傳遞給 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法來抑制或記錄此例外。
DbContextOptionsBuilder正如該錯誤所暗示的那樣,我沒有做任何奇怪的事情。我不知道如何診斷“......這可能需要建立新的服務提供商”。在大多數測驗中,我通常會創建一個背景關系:new DbContextOptionsBuilder<TContext>().UseSqlite("DataSource=:memory:")whereTContext是我上面提到的背景關系型別之一。
我在 repo 上閱讀了許多問題,并發現 EF 對各種事物進行了大量快取,但關于該主題的檔案不存在。建議是“查找導致快取這么多服務提供程式的原因”,但我不知道該查找什么。
有兩種解決方法:
builder.EnableServiceProviderCaching(false)這顯然對性能非常不利builder.ConfigureWarnings(x => x.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning))這忽略了問題
我假設“服務提供者”是指 EF 的內部 IoC 容器。
我想知道的是:我有很多DbContext型別(以及IModel型別)這一事實是否會影響服務提供者快取?兩者有關系嗎?(我知道 EF為 each 快取了IModel一個DbContext,它是否也為每個快取了一個服務提供者?)
uj5u.com熱心網友回復:
服務提供者快取純粹基于背景關系選項配置 - 背景關系型別、模型等無關緊要。
在 EF Core 5.0 中,根據源代碼的關鍵是
static long GetCacheKey(IDbContextOptions options) => options.Extensions
.OrderBy(e => e.GetType().Name)
.Aggregate(0L, (t, e) => (t * 397) ^ ((long)e.GetType().GetHashCode() * 397) ^ e.Info.GetServiceProviderHashCode());
而在 EF Core 6.0 中,關鍵是Equals具有類似語意的重寫方法的選項實體。
因此,您使用的選項有所不同 -OnConfiguring如果您要覆寫它并修改其中的選項,則無論是最初還是在呼叫之后。這是您需要弄清楚的(在 5.0 中,您可以使用上述方法來檢查密鑰,在 6.0 中,您可以使用一些靜態欄位來存盤第一個選項實體并使用它來檢查Equals下一個)。
請注意,EF Core 快取原始OnConfiguring呼叫選項和呼叫后選項,因此它們都算在內。順便說一句,生成警告的代碼位于同一個地方(類)- source。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/396429.html
標籤:C# 单元测试 实体框架核心 集成测试 ef-core-5.0
