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

时间:2016-03-18 05:15:35

标签: c# entity-framework asp.net-web-api ef-code-first graphdiff

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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

希望有所帮助:)