【发布时间】:2011-08-01 17:34:18
【问题描述】:
DbContext 上没有Detach(object entity)。
我有能力先分离 EF 代码上的对象吗?
【问题讨论】:
标签: entity-framework entity-framework-4.1 ef-code-first
DbContext 上没有Detach(object entity)。
我有能力先分离 EF 代码上的对象吗?
【问题讨论】:
标签: entity-framework entity-framework-4.1 ef-code-first
这是一个选项:
dbContext.Entry(entity).State = EntityState.Detached;
【讨论】:
entity 必须是属于您的模型类(Person、Customer、Order 等)的类型的物化对象。 )。您不能直接将 IQueryabledbContext.Entry(...)。这是你的意思吗?Detached。如果您想从数据库中加载实体而不将它们附加到上下文(无更改跟踪),请使用AsNoTracking。
AsNoTracking 的实体,那么延迟加载仍然有效。这个方法不会。
如果您想分离现有对象,请遵循@Slauma 的建议。如果您想加载对象而不跟踪更改,请使用:
var data = context.MyEntities.AsNoTracking().Where(...).ToList();
正如评论中提到的,这不会完全分离实体。它们仍然是附加的并且延迟加载工作,但实体没有被跟踪。例如,如果您只想加载实体以读取数据并且不打算修改它们,则应使用此选项。
【讨论】:
using(ctx){ return ctx....ToList(); }。在这种情况下,使用AsNoTracking() 会很有意义,因为我会省去不必要地填充对象上下文。我想它可能会对性能和内存消耗有好处,尤其是对于大型列表,对吧?
之前的两个答案都提供了很好的说明,但是,这两个答案都可能使您仍然将实体加载到 EF 的上下文和/或其更改跟踪器中。
当你改变小数据集时这不是问题,但当你改变大数据集时它会成为一个问题。 EF 会增加内存和资源的使用,这反过来会降低过程性能,因为它使用更多的数据/实体。
其他两种方法都有效,但在这种情况下,Microsoft recommends 清理更改跟踪器而不是单独分离实体
清除数据更改循环上的更改跟踪器(例如更改一大块数据)可以让您免于这个麻烦。
context.ChangeTracker.Clear();
这将从上下文中卸载/分离所有实体及其相关的 changeTracker 引用,因此请在 context.SaveChanges() 之后小心使用。
【讨论】: