实体框架 - 在分离实体后恢复导航属性

时间:2017-11-11 08:29:13

标签: .net entity-framework entity-framework-6 lazy-loading objectcontext

My Entity Framework模型(使用带有ObjectContext的EF 6.1),启用了延迟加载,具有各种导航属性。

例如:

// 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.IsLoaded设置为false,但这不起作用 - 实体未重新加载,并且EF罩IsLoaded下的某个地方只是获取回到true

2 个答案:

答案 0 :(得分:1)

您可以使用LoadProperty方法:

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

答案 1 :(得分:0)

分离实体只需使用AsNoTracking

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

如果您希望实体框架再次跟踪您需要的更改将其附加到上下文并使用ctx.myDbSet.Include(x => x.Something)