2012-02-29 113 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