我正在使用实体框架4.3和DbContext来更新我的数据库。我有一个用户集合,允许修改任何用户,然后保存更改。我的问题是,当调用SaveChanges()时,我发现一个额外的记录被意外更新。
例如,将pk=5的用户更新为"已撤销"状态也会为pk=1 的用户生成sql更新
SQL探查器跟踪:
(没想到)
exec sp_executesql N'declare @p int
update [db].[Users]
set @p = 0
where (([UsersPk] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [db].[Users]
where @@ROWCOUNT > 0 and [UsersPk] = @0',N'@0 int,@1 binary(8)',@0=1,@1=0x0000000000011BFD
(预期)
exec sp_executesql N'update [db].[Users]
set [AccessStatus] = @0
where (([UsersPk] = @1) and ([RowVersion] = @2))
select [RowVersion]
from [db].[Users]
where @@ROWCOUNT > 0 and [UsersPk] = @1',N'@0 varchar(10),@1 int,@2 binary(8)',@0='revoked',@1=5,@2=0x0000000000011C01
为了调试这个,我使用了这个
var mods = DbContext.ChangeTracker.Entries<User>().Where(u => u.State == EntityState.Modified);
Debug.Print(mods.Count().ToString());
以获得修改后的条目数,返回1,但对SaveChanges()的调用返回2,事实上,当更新2个条目时,它应该返回2。
我不明白为什么会生成第一个查询,因为这个用户的属性没有更新——无论如何都不应该更新。
我怀疑我忽略了一些相当简单的东西,但不知道是什么。非常感谢任何建议。
这看起来像是.NET 4中的一个错误,它在即将发布的.NET 4.5版本中得到了修复,修复程序也可以作为修补程序使用。这个错误出现在EF 4.3上,因为它基于底层的.NET 4核心库。
修补程序的详细信息如下:http://support.microsoft.com/kb/2390624
您需要联系Microsoft客户服务和支持以获取修补程序。然而,正如我所说,这个错误在.NET 4.5中也得到了修复,它将随时处于测试版。
不幸的是,没有任何好的通用解决方案。