何时禁用代理生成并使用 AsNoTracking?

When to disable proxy generation and use AsNoTracking?

在我的 WebApi 项目中,我使用 EF6,遵循 Uow 和通用存储库模式,我还将我的模型映射到 dto,反之亦然。

目前我在创建 dbContext 时设置了以下内容:

this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;

我在从数据库中获取数据时也使用 AsNoTracking

更新数据库时,我在处理小实体(即无关系)时直接使用 dbContext 来附加实体。我将 GraphDiff 用于复杂实体(即具有关系)。

启用代理和跟踪时,甚至禁用它们时,我注意到发送到数据库的 SQL 语句包括所有 table 的列,而不仅仅是那些具有实际上已经改变了。

但是,GraphDiff 在将更改保存到数据库之前再次加载实体。本例中的 SQL 语句也包含所有列。这是正确的行为吗?

因此,在我的情况下,在处理分离的实体时禁用代理和跟踪是否安全?

是的,我猜是;这是 EF 处理乐观并发的一种方式。

Optimistic concurrency involves optimistically attempting to save your entity to the database in the hope that the data there has not changed since the entity was loaded. If it turns out that the data has changed then an exception is thrown and you must resolve the conflict before attempting to save again.

EF 检查这一点的唯一方法是加载所有列,检查是否有任何更改,如果发现记录在上次加载和保存之间被修改,则阻止保存。检查 this.

如果您没有时间戳列,您可以使用此属性(更多信息 here[ConcurrencyCheck] 通知 EF 该特定列是用于了解记录是否存在的列改变了;这应该避免为并发检查加载所有内容。

希望对您有所帮助:)