2013-10-17 62 views
0

我使用Code First與實體框架。EF懶惰加載 - 我可以稍後檢索子集合嗎?

我有一個虛擬屬性類到另一個類(延遲加載)。

public class Order{ 
    public int Id { get; set; } 
    public virtual ICollection<OrderItem> OrderItems { get; set; } 
} 

如果我從數據庫中獲得Order,不包括OrderItem,然後關閉的DbContext,有沒有可能以後加載它們?如果是,如何?

例如。

private static Order GetFirstOrder(Func<Order, bool> predicate) 
{ 
    using (var db = new MyContext()) 
    { 
     return db.Orders.First(predicate); 
    } 
} 

private static void DoSomething() 
{ 
    var order = GetFirstOrder(a => a.Id == 1); 
    //do something with OrderItems later? 
} 
+0

如果您想在稍後加載相關實體,您顯然需要上下文實例。創建一個實例,附加實體,以便EntityChangeTracker可以跟蹤它,然後延遲加載相關實體。 – jannagy02

回答

0

您應該包括集合名稱。

var myItemWithCollection = (from s in db.tableName.Include("ListName").Where(s => s.Id.Equals(ItemId)) select s).FirstOrDefault(); 
+0

但是,如果方法已經是'return db.Orders.First(predicate);',而不是'return db.Orders.Include(「OrderItem」)。First(predicate);',可以稍後加載嗎?或不? – Tschareck

+0

你的問題是,關閉上下文後集合爲空? (和其餘的領域是好的..) – ilansch

+0

它是空的,我明白爲什麼。但是我想知道在上下文已經處理完後,我能做些什麼來加載集合。 – Tschareck

1

Lazy loading將可只要查詢的上下文是活

如果它已關閉,則結束,您必須重新查詢(某些GetOrderItemsByOrder查詢)或重新附加。無論如何,要做一些「手動」的事情。

+0

'只要上下文是活着的'和實體,並由'dynamic-proxy'包裝。 – haim770