1

我的实体框架模型(使用EF 6.1和ObjectContext)启用延迟加载,并具有各种导航属性。实体框架 - 在分离实体后恢复导航属性

例如:

// Orders is a navigation property (collection), which, when first iterated, 
// loads the collection of Order entities from the DB 
var orders = Customer.Orders.ToList(); 

在我的应用程序,性能方面的原因,我希望能够脱离Order实体,并允许他们被垃圾收集:

MyContext.Detach(order1); 
MyContext.Detach(order2); 
MyContext.Detach(order3); 

但是,我有发现当我只分离子实体的一个子集(即不是全部子实体)时,下一次迭代Customer.Orders不起作用 - 分离的实体不是返回集合的一部分。

我可以编写什么样的代码来让Customer.Orders导航属性在这种情况下恢复并正常工作,迫使它重新加载并重新连接所有实体,包括之前分离的实体?

我已经试过手动设置Customer.Orders.IsLoadedfalse,但是,这并不工作 - 实体没有被重新加载,并某处EF罩IsLoaded下简单地被重新设置为true

+0

我认为.Load()不会工作? – DevilSuichiro

+1

如果由于性能原因您必须分离实体*我有一种感觉,您的问题在于您的体系结构的更深层次。更具体地说:生活时间过长的情况。 –

回答

1
改变实体只需使用AsNoTracking

using (var context = new BloggingContext()) 
{ 
    var blogs = context.Blogs 
     .AsNoTracking() 
     .ToList(); 
} 

您可以使用LoadProperty方法:

context.LoadProperty(customer, c => c.Orders, MergeOption.OverwriteChanges);

+1

真棒,这正是我正在寻找的。 – Ross

0

脱离,如果你想再次实体框架来跟踪你需要它附加到上下文和使用ctx.myDbSet.Include(X => x.Something)