我正在使用Entity Framework 4.3和DbContext来更新我的数据库。我有一组用户,允许修改任何用户,然后保存更改。我的问题是,我发现在调用SaveChanges()时会意外更新额外的记录。
例如,将pk = 5更新为“revoked”状态的用户也会为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个条目。
我无法弄清楚为什么第一个查询会被生成,因为这个用户的属性没有被更新 - 好吧它们不应该是。
我怀疑我在这里忽略了一些相当简单但却无法弄清楚的东西。任何建议都非常感谢。
答案 0 :(得分:1)
这看起来像.NET 4中的一个错误,该错误在即将发布的.NET 4.5版本中修复,并且修补程序也可用作修补程序。该漏洞出现在EF 4.3上,因为它基于底层的.NET 4核心库。
此修补程序的详细信息如下:http://support.microsoft.com/kb/2390624
您需要与Microsoft客户服务和支持部门联系以获取此修补程序。但是,就像我说的那样,这个bug也在.NET 4.5中得到了修复,现在它将在任何一天都处于测试阶段。
不幸的是,没有任何一般的解决方法。