如何在Entity Framework Code First中分离对象?


Answers:


156

如果要分离现有对象,请遵循@Slauma的建议。如果要加载对象而不跟踪更改,请使用:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

如评论中所述,这不会完全分离实体。它们仍然处于连接状态,并且延迟加载工作正常,但是未跟踪实体。例如,如果您只想加载实体以读取数据并且不打算修改它们,则应使用此方法。


3
@Ladislav:这确实可能是Lol编码器的意思。尽管我经常加载对象列表并立即处理上下文,但我从未使用过并考虑过这种方法,例如using(ctx){ return ctx....ToList(); }。在这种情况下,使用AsNoTracking()将是很有意义的,因为我会省去不必要地填充对象上下文的麻烦。我想这可能会带来性能和内存消耗的好处,尤其是对于大型列表,对吧?
Slauma 2011年

1
@Slauma:是的,它具有性能优势。这实际上就是为什么存在这种方法的原因。在ObjectContext API中使用这种方法稍微复杂一些。
Ladislav Mrnka 2011年

2
这会禁用延迟加载吗?
肖恩·麦克林

3
实际上,这不会禁用延迟加载,只会禁用更改跟踪并提高性能=实体仍处于连接状态。我在回答此问题后找到了它,因此您应该将@Slauma的问题标记为有效答案。
Ladislav Mrnka

1
这就是我要的。我想要延迟加载以及仅修改分离实体的功能。
Shawn Mclean

255

这是一个选择:

dbContext.Entry(entity).State = EntityState.Detached;

3
检索返回IQueryable的对象时可以这样做吗?
Shawn Mclean

1
@大声笑的编码器:我不确定我是否理解正确,但是entity必须是属于您的模型类(人员,客户,订单等)类型的物化对象。您不能直接将IQueryable <T>传递给dbContext.Entry(...)。那是你的意思吗?
Slauma 2011年

9
@EladBenda:这取决于。如果要分离已经附加到上下文的对象,请将状态设置为Detached。如果要从数据库加载实体而不将它们完全附加到上下文(不进行更改跟踪),请使用AsNoTracking
Slauma

1
我发现此方法有一个有趣的问题。即使实体可能是代理类,在将其状态更改为后,延迟加载也将无法进行Detached
kjbartel

4
@kjbartel:这是预期的行为,因为实体与上下文没有链接。
里卡多·索扎
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.