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);
我的 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);