由于不必要的更新导致乐观并发异常



我有一个对象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。

最新更新