1

EntityFramework4.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

これは、次の.NET4.5リリースで修正された.NET4のバグのように見えます。この修正は、修正プログラムとしても利用できます。このバグは、基盤となる.NET 4コアライブラリに基づいているため、EF4.3で発生します。

ホットフィックスの詳細は次のとおりです:http ://support.microsoft.com/kb/2390624

ホットフィックスを入手するには、マイクロソフトカスタマーサービスおよびサポートに連絡する必要があります。ただし、前述したように、このバグは.NET 4.5でも修正されており、現在ベータ版になっています。

残念ながら、一般的な回避策はありません。

于 2012-02-29T05:07:47.747 に答える