假設我已經擴展了身份框架dbContext來構建我自己的,並且我已經註冊了dbContext並獲取了與當前ApplicationUser相關的實體的dbContext身份驗證的控制器,實體框架將關聯導致服務器錯誤的兩個實體,因為循環引用。

我們不想序列化循環引用。

因此,我們在方法中創建一個新的dbContext ,它將實現新的dbcontext並查詢不相關的實體,這將起作用。但這是不可測試的 ,我們不希望我們的控制器嚴格依賴於dbContext ,我們希望它被注入。

所以我們在構造函數中添加了第二個參數,遺憾的是這會使系統注入相同的dbContext兩次 ,不太有用。

我們嘗試創建一個從dbContext繼承並添加服務並使用它的類fakeDbContext但現在我們有兩個dbcontext ,它可能會生成遷移,配置和錯誤......

在新的MVC6中這樣做的正確方法是什麼?

編輯...

我發現如果我的控制器需要一個IEnumerable<dbContext>我得到所有對象註冊為該類型的服務,所以只需將startup.cs中的部分加倍,我們在服務註冊區域中添加dbContext ,我得到其中兩個。 ..

這裡的缺點是,我不知道哪一個是處女 ,它看起來像登記的順序,但我不知道,如果這將改變。

編輯2 ...

我創建了一個TransientDbService類,它只有一個工廠方法接受IserviceProvider ,它使用它來獲取構造dbContext的選項,然後公開它。我已將其註冊為瞬態,然後在控制器中我需要此服務類型。

這裡的缺點是,如果我需要第三個dbContext我應該編寫更多的代碼,更多的代碼意味著錯誤和維護它。

編輯3 ...

根本沒有兩個dbContext。以下設置允許我沒有關係的價值。

Database.ChangeTracker.QueryTrackingBehavior = Microsoft.Data.Entity.QueryTrackingBehavior.NoTracking;

這裡的缺點是我不能使用我的模型圖,使一切更複雜......

編輯4 ...

https://github.com/aspnet/DependencyInjection/issues/352

一般承認的答案

在某些情況下,您認為沒有跟踪查詢會有所幫助是正確的,但有時您需要創建多個DbContext實例。

您通常在啟動時使用AddDbContext<TContext>()方法,以確保每個請求創建一個上下文類型的實例,並在其上設置正確的DbContextOptions和服務提供程序。當您需要偏離此模式時,您有幾個選項,例如:

  1. 在派生的DbContext類中包含一個構造函數,該構造函數接受IServiceProvider並將其傳遞給基礎構造函數。確保您的控制器採用IServiceProvider 。一旦你這樣做,你應該能夠用這樣的東西手動創建DbContext

    using(var context1 = new MyDbContext(serviceProvider), var context2 = new MyDbContext(serviceProvider)) { ...

  2. 為了避免必須更改派生的DbContext類型的構造函數簽名,您可以利用DbContextActivator類(它是我們的內部命名空間),例如:

    using(var context1 = DbContextActivator.CreateInstance<MyDbContext>(serviceProvider), var context2 = DbContextActivator.CreateInstance<MyDbContext>(serviceProvider) {...

注意:如果您仍在啟動時使用AddDbContext<MyDbContext>(options => ...) ,它應該從服務提供商處自動提取這些選項。但您也可以選擇在構造函數中包含DbContextOptions作為參數,或者OnConfiguring()覆蓋OnConfiguring()方法。

我給你的例子在一個using塊中創建了兩個獨立的DbContexts ,但是你也應該能夠將它們與你在控制器的構造函數中註入的常規“per-request”DbContext混合。

除了目前可用的這些選項之外,我還創建了一個新問題,以跟踪有關如何在同一請求中創建相同DbContext類型的多個實例的其他可能改進:

https://github.com/aspnet/EntityFramework/issues/4441




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