2012-02-29 101 views
1

我正在使用实体框架4.3和DbContext来更新我的分贝。我有一组用户,允许任何用户进行修改,然后更改保存。我的问题是,我发现调用SaveChanges()时意外更新了额外的记录。实体框架4.3 DbContext SaveChanges更新记录比预期更

例如,更新与PK用户= 5〜 '撤销' 状态也可用来产生与PK用户一个SQL UPDATE = 1个

SQL分析器跟踪:

(不期望THIS)

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

我们无法理解你在做什么与上下文 – Eranga 2012-02-29 01:07:58

+0

我正在修改一个实体并调用SaveChanges()如上所述 – pilsdumps 2012-02-29 13:15:43

回答

1

这看起来像.NET 4中的一个错误,在即将推出的.NET 4.5发行版中修复,并且修复程序也可作为修补程序提供。该错误在EF 4.3上显示,因为它基于底层的.NET 4核心库。

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

您需要联系微软客户服务和支持以获得修复程序。但是,正如我所说的那样,这个bug在.NET 4.5中也得到了修复,它现在将在任何一天进行测试。

不幸的是,没有任何好的一般解决方法。

+0

我正在将此标记为答案并将等待.Net 4.5 Beta来查看这是否解决。感谢您输入ajcvickers。 – pilsdumps 2012-02-29 13:14:14

+0

今天.NET 4.5和EF 5.0 beta1已经发布。 http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx – 2012-02-29 18:54:39

+0

感谢您的更新。不幸的是我使用的是Windows XP,因此无法使用它。 – pilsdumps 2012-02-29 21:30:41