DbContext上没有 Detach(object entity)。
DbContext
Detach(object entity)
我是否有能力首先在 EF 代码上分离对象?
这是一个选择:
dbContext.Entry(entity).State = EntityState.Detached;
如果想要分离现有对象,请遵循@Slauma 的建议。如果想要加载对象而不跟踪更改,请使用:
var data = context.MyEntities.AsNoTracking().Where(...).ToList();
正如注释中提到的,这不会完全分离实体。它们仍然是附加的,并且延迟加载工作,但是不会跟踪实体。例如,如果您只想加载实体来读取数据,并且不打算修改它们,那么应该使用这种方法。
前面的两个答案都提供了很好的说明,但是,这两个答案都可能让您看到仍然加载到 EF 的上下文和/或其变更跟踪器中的实体。
在更改小型数据集时,这不是问题,但在更改大型数据集时,这将成为问题。EF 会增加内存和资源的使用,这反过来会降低过程性能,因为它使用更多的数据/实体。
其他两种方法都是有效的,但是在这种情况下,微软建议清理变更跟踪器,而不是单独分离实体
清除数据更改循环(例如更改数据块)上的 Change 跟踪器可以避免这种麻烦。
context.ChangeTracker.Clear();
这将从上下文中卸载/分离所有实体及其相关的 changeTracker 引用,因此在使用 context.SaveChanges()时要小心。
context.SaveChanges()