1

我正在使用 Entity Framework 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 个条目。

我无法弄清楚为什么会生成第一个查询,因为该用户的属性没有被更新 - 无论如何它们都不应该更新。

我怀疑我在这里忽略了一些相当简单的事情,但不知道是什么。任何建议都非常感谢。

4

1 回答 1

1

这看起来像是 .NET 4 中的一个错误,该错误已在即将发布的 .NET 4.5 版本中修复,并且该修复程序也可作为修补程序使用。该错误出现在 EF 4.3 上,因为它基于底层 .NET 4 核心库。

修补程序的详细信息在这里:http: //support.microsoft.com/kb/2390624

您需要联系 Microsoft 客户服务和支持以获取此修补程序。然而,就像我说的,这个错误也在 .NET 4.5 中得到修复,现在任何一天都将处于测试阶段。

不幸的是,没有任何好的通用解决方法。

于 2012-02-29T05:07:47.747 回答