实体框架 - 分离实体后还原导航属性



我的实体框架模型(将 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.IsLoaded设置为 false ,但这不起作用 - 实体不会重新加载,并且在 EF 引擎盖下的某个地方IsLoaded只是被设置回true.

您可以使用 LoadProperty 方法:

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

只需使用 AsNoTracking 即可分离实体

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

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

最新更新