[英]Disable Lazy-Load Entity Framework Navigation Properties
題
是否有任何方法可以使當嘗試訪問未明確包含.include()的導航屬性時,從DbContext查詢返回的實體返回null(或其他特定值)? 例如:
var parents = dbContext.People.Where(p => p.Children.Any()).Include("Children").ToList();
//Assert all parents have children...
Assert.IsTrue(parents[0].Children.Any());
和...
var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
//Assert all children collections are null... NOT LAZY LOADED
Assert.IsTrue(parents[0].Children == null);
需要明確的是,我不希望該屬性被急切加載。 我根本不希望加載它。 我嘗試過從上下文中分離實體,但這無濟於事。
背景
我嘗試執行此操作的原因是,我需要在與創建DbContext的線程不同的線程上訪問實體對象。 因此,我不希望將Navigation屬性設置為某些延遲執行linq語句。 問題是,由於我無法訪問DbContext以檢查導航屬性是否已加載(由於它不是線程安全的),因此我無法知道是否需要在當前線程上創建新的DbContext來檢索丟失的屬性數據。 這是我試圖解決的相同問題,即如何確定是否在沒有DbContext的情況下加載了導航屬性
更新資料
將DbContext的Configuration.LazyLoadingEnabled屬性設置為false可以防止linq自動連接,但是對於作為集合的導航屬性,這將導致一個空集合而不是null。
為了解決基於集合的問題,我修改了T4模板以生成一個空的默認構造函數,而不是將每個ICollection設置為一個空HashSet的默認構造函數。
您可以通過設置DbContext
的Configuration.LazyLoadingEnabled
屬性來啟用/禁用延遲加載
context.Configuration.LazyLoadingEnabled = false;
var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
context.Configuration.LazyLoadingEnabled = true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.