簡體   English   中英

實體框架5急切加載父屬性

[英]Entity Framework 5 eager loading with parent properties

我有一些父實體( Order )的查詢,我想熱切地加載它的一些子集合或屬性。 我有這樣的查詢:

public void QueryMethod()
{
    using (var context = new MyContext())
    {
        var orders = context.Order.Include("OrderProduct")
                                  .Include("OrderProduct.ProductVariant")
                                  .Where(some query)
                                  .ToList();
    }
}

我正在做的是循環遍歷此訂單集合,對於每個Order我都會訪問OrderProductProductVariant屬性。 當上下文處於活動狀態時,我可以在查詢方法中執行此操作。 但是當我嘗試在上下文之外訪問ProductVariant.OrderProduct ,我得到了ObjectDisposedException

順便說一下,我試圖訪問ProductVariant.OrderProduct有一些奇怪的原因。 我想我不應該這樣訪問它,但我的觀點是我可以從OrderProductProductVariant ,但是我無法從ProductVariant訪問OrderProduct 我想知道為什么我得到這個錯誤,盡管我將OrderProduct.ProductVariant添加到我的渴望加載屬性中。 它不應該雙向工作嗎?

任何幫助將非常感謝。

您在上下文外部獲得ObjectDisposedException這一事實表明Entity Framework嘗試通過數據庫中的延遲加載來加載ProductVariant.OrderProduct引用的對象。

現在,這並不一定意味着 - 這個陳述聽起來很奇怪 - ProductVariant.OrderProduct尚未加載並填充正確的實體。 也許這是因為它的是相反的屬性OrderProduct.ProductVariant通過預先加載加載。 對於一對一和一對多關系,EF將在加載導航屬性時自動填充反向導航屬性(“關系修正”)。

盡管填充了反向導航屬性,但它不一定標記為已加載 ,這是由每個導航屬性的上下文維護的標志,它告訴EF當您在代碼中訪問它時是否必須通過延遲加載從數據庫加載導航屬性。

例如,對於一對多關系,很容易看出EF由於關系修正而在填充時不得將導航屬性標記為已加載。 例如:如果您加載包含其客戶引用的訂單 - context.Orders.Include("Customer").Single... - 急切加載的客戶中的Orders集合將包含此加載的訂單(因為關系修正)。 但是這個單一訂單很可能不是該客戶唯一的訂單(或者至少EF不知道這是唯一訂單還是數據庫中有更多訂單)。 如果您訪問Customer.Orders集合,您通常期望不僅返回此單個訂單而且還返回客戶的所有訂單 - 換句話說,您希望發生延遲加載查詢,從數據庫加載客戶的其余訂單。

現在,這個論點並不能真正說服一對一的關系,因為對於這種關系,很明顯數據庫中不能有多個相關對象。 那么,如果已經加載了這個單個相關對象,為什么EF想要運行延遲加載查詢?

我不知道為什么EF仍然試圖為一對一關系加載逆導航屬性,但是在這方面它只是不區分一對多關系和一對一關系。 也許EF遵循一般規則,即如果關系的主要方面由關系修正填充,則它不會被標記為已加載,並且在您訪問它時,任何情況下都會發生延遲加載。 (我無法從你的代碼片段中看到,如果OrderProductProductVariant是主體,那只是猜測。)

無論如何,在你的情況下,我會禁用延遲加載甚至代理創建(包括禁用延遲加載),因為你在using塊中使用Include並且延遲加載在這里沒有任何好處。 你所擁有的例外應該會消失:

using (var context = new MyContext())
{
    context.Configuration.ProxyCreationEnabled = false;

    var orders = context.Order.Include("OrderProduct")
                              .Include("OrderProduct.ProductVariant")
                              .Where(some query)
                              .ToList();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM