1

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

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

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

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

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

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

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

那么,在我的场景中,在处理分离实体时禁用代理和跟踪是否安全?

4

1 回答 1

0

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

乐观并发涉及乐观地尝试将您的实体保存到数据库中,希望自加载实体以来那里的数据没有更改。如果事实证明数据已更改,则会引发异常,您必须在尝试再次保存之前解决冲突。

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

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

希望能帮助到你 :)

于 2016-03-18T09:15:10.580 回答