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