我正在使用 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 个条目。
我无法弄清楚为什么会生成第一个查询,因为该用户的属性没有被更新 - 无论如何它们都不应该更新。
我怀疑我在这里忽略了一些相当简单的事情,但不知道是什么。任何建议都非常感谢。