如何首先在实体框架代码中分离对象?

DbContext上没有 Detach(object entity)

我是否有能力首先在 EF 代码上分离对象?

130513 次浏览

这是一个选择:

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

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

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

正如注释中提到的,这不会完全分离实体。它们仍然是附加的,并且延迟加载工作,但是不会跟踪实体。例如,如果您只想加载实体来读取数据,并且不打算修改它们,那么应该使用这种方法。

前面的两个答案都提供了很好的说明,但是,这两个答案都可能让您看到仍然加载到 EF 的上下文和/或其变更跟踪器中的实体。

在更改小型数据集时,这不是问题,但在更改大型数据集时,这将成为问题。EF 会增加内存和资源的使用,这反过来会降低过程性能,因为它使用更多的数据/实体。

其他两种方法都是有效的,但是在这种情况下,微软建议清理变更跟踪器,而不是单独分离实体

清除数据更改循环(例如更改数据块)上的 Change 跟踪器可以避免这种麻烦。

context.ChangeTracker.Clear();

这将从上下文中卸载/分离所有实体及其相关的 changeTracker 引用,因此在使用 context.SaveChanges()时要小心。