Entity framework Entity Framework 4.3 DbContext SaveChanges更新的记录比预期的多

Entity framework Entity Framework 4.3 DbContext SaveChanges更新的记录比预期的多,entity-framework,dbcontext,savechanges,Entity Framework,Dbcontext,Savechanges,我正在使用EntityFramework4.3和DbContext更新我的数据库。我有一个用户集合,允许修改任何用户,然后保存更改。我的问题是,调用SaveChanges()时,我发现一条额外的记录被意外更新 例如,将pk=5的用户更新为“已撤销”状态也会为pk=1的用户生成sql更新 SQL探查器跟踪: (没想到会这样) (预计) 为了调试这个,我使用了这个 var mods = DbContext.ChangeTracker.Entries<User>().Where(u =&g

我正在使用EntityFramework4.3和DbContext更新我的数据库。我有一个用户集合,允许修改任何用户,然后保存更改。我的问题是,调用SaveChanges()时,我发现一条额外的记录被意外更新

例如,将pk=5的用户更新为“已撤销”状态也会为pk=1的用户生成sql更新

SQL探查器跟踪:

(没想到会这样)

(预计)

为了调试这个,我使用了这个

var mods = DbContext.ChangeTracker.Entries<User>().Where(u => u.State == EntityState.Modified);
Debug.Print(mods.Count().ToString());
var mods=DbContext.ChangeTracker.Entries(),其中(u=>u.State==EntityState.Modified);
Debug.Print(mods.Count().ToString());
获取返回1的已修改条目数,但调用SaveChanges()返回2,因为2个条目数已更新

我不明白为什么第一个查询是在这个用户的属性没有被更新的情况下生成的——反正它们也不应该被更新


我怀疑我忽略了一些非常简单的事情,但我不知道是什么。非常感谢您的建议。

这看起来像是.NET 4中的一个bug,在即将发布的.NET 4.5版本中已修复,并且修复程序也可以作为热修复程序提供。这个bug出现在EF4.3上,因为它基于底层的.NET4核心库

修补程序的详细信息如下:

您需要联系Microsoft客户服务和支持以获取修补程序。然而,正如我所说的,这个bug在.NET4.5中也得到了修复,现在它随时都会进入测试版


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

这看起来像是.NET 4中的一个bug,它在即将发布的.NET 4.5版本中已修复,并且修复程序也可以作为热修复程序提供。这个bug出现在EF4.3上,因为它基于底层的.NET4核心库

修补程序的详细信息如下:

您需要联系Microsoft客户服务和支持以获取修补程序。然而,正如我所说的,这个bug在.NET4.5中也得到了修复,现在它随时都会进入测试版


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

我们无法了解您对上下文的看法我正在修改一个实体并调用SaveChanges(),如上所述我们无法了解您对上下文的看法我正在修改一个实体并调用SaveChanges()如上所述,我将此标记为答案,并将等待.NET4.5beta测试版,看看这是否解决。感谢ajcvickers..NET 4.5和EF 5.0 beta1今天发布。谢谢你的更新。不幸的是,我正在使用Windows XP,因此无法使用它。我正在将此标记为答案,并将等待.Net 4.5测试版,以查看此问题是否得到解决。感谢ajcvickers..NET 4.5和EF 5.0 beta1今天发布。谢谢你的更新。不幸的是,我正在使用Windows XP,因此无法使用它。
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());