レコードの巨大なデータセット (数十万単位) を取り込み、アトミック トランザクションで一度に 1 つずつ、それぞれのフィールドを更新する必要があります。それらのレコードは互いに無関係であり、数十万すべてを盲目的に更新したくありません (このテーブルにはビューとインデックスがあり、非常に禁止されています)。巨大なトランザクションを実行せずにこれを機能させる唯一の方法は次のとおりです (コンテナーはカスタム ObjectContext への参照です)。
var expiredWorkflows = from iw in container.InitiatedWorkflows
where iw.InitiationStatusID != 1 && iw.ExpirationDate < DateTime.Now
select iw.ID;
foreach (int expiredWorkflow in expiredWorkflows)
container.ExecuteStoreCommand("UPDATE dbo.InitiatedWorkflow SET InitiationStatusID = 7 WHERE ID = @ID", new SqlParameter() { ParameterName = "@ID", Value = expiredWorkflow.ToString() } );
それぞれをループして、コンテナーを介してフィールドを更新してから SaveChanges() を呼び出してみましたが、すべてが 1 つのトランザクションとして実行されます。foreach ループで SaveChanges() を呼び出してみましたが、トランザクション例外がスローされました。ObjectContext を使用してやろうとしていることを行う方法はありますか? (上記の選択は、ID だけでなく完全なオブジェクトを返すように変更されます):
foreach (var expiredWorkflow in expiredWorkflows)
expiredWorkflow.InitiationStatusID = 7
container.SaveChanges(SaveOptions.OneAtATime);