我有一个对象Account,它被许多对象Payment引用。我看到,当我更改付款状态时,Account的rowversion属性Version也会更新为类似这样的SQL:
update [dbo].[Account]
set @p = 0
where (([Id] = 2606 /* @0 */)
and ([Version] = 0x0000000000000C8C /* @1 */))
select [Version]
from [dbo].[Account]
where @@ROWCOUNT > 0
and [Id] = 2606 /* @0 */
在该交易中,账户绝对没有其他更新。我检查了我的代码好几次,没有看到对Account对象的任何修改。此外,我已经覆盖了DbContext的SaveChanges,并且在EntityState中没有看到Account对象的条目。已修改…
最大的问题不仅是不必要的更新,而且与一个账户相关的几个支付可能会同时更新,当然会抛出乐观并发异常,交易会回滚,必须重复。
有人能建议在我的代码中检查/修复/更改什么来阻止这一切吗。
假设您使用的是EF4.x,那么有一个修补程序可以纠正这个问题。我有同样的问题,我可以确认修补程序纠正了它。
http://support.microsoft.com/kb/2390624
FIX:当应用程序使用.NET Framework 4 中的实体框架时,SQL应用程序中的主体实体会生成不必要的更新
Matthew Artz答案的补充:
http://support.microsoft.com/kb/2390624提到:
请与Microsoft客户服务和支持联系以获取修补程序。
在这里你可以请求并获得修补程序:请求修补程序
您将收到一封带有下载URL的电子邮件。请确保仅在(
和)
之间复制URL。