Entity Framework - 分离实体后恢复导航 属性

Entity Framework - restoring navigation property after detaching entities

我的 Entity Framework 模型(将 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.

分离实体只需使用 AsNoTracking

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

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

您可以使用 LoadProperty 方法:

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