繁体   English   中英

什么时候禁用代理生成并使用AsNoTracking?

[英]When to disable proxy generation and use AsNoTracking?

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

当前,我在创建dbContext时设置以下dbContext

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

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

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

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

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

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

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

乐观并发涉及乐观地尝试将您的实体保存到数据库,以期自从加载实体以来那里的数据没有改变。 如果事实证明数据已更改,则将引发异常,并且必须先解决冲突,然后再尝试保存。

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

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

希望能帮助到你 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM