2013-10-17 48 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