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つのエントリが更新されるためです。
このユーザーのプロパティが更新されていないため、最初のクエリが生成される理由がわかりません。とにかく更新されるべきではありません。
私はここでかなり簡単なことを見落としているのではないかと思いますが、何を理解することはできません。どんな提案でも大歓迎です。