SQL 2008 R2 11月リリースデータベースと.net 4.0 Beta 2 Azureワーカーロールアプリケーションを使用する。ワーカー・ロールはデータを収集し、1つのID列を持つ単一のSQL表に挿入します。このワーカー・ロールの複数のインスタンスが実行されている可能性が高いため、SQLテーブルにInsert Within Ofトリガーを作成しました。トリガーは、SQLマージ機能を使用してUpsert機能を実行します。 T-SQLの使用私は、トリガー関数の代わりに挿入を正しく検証できました。既存の行が更新されている間に新しい行が挿入されました。OptimisticConcurrencyException - Entity Frameworkでトリガーを挿入する代わりにSQL 2008 R2を使用する
Create Trigger [dbo].[trgInsteadOfInsert] on [dbo].[Cars] Instead of Insert
as
begin
set nocount On
merge into Cars as Target
using inserted as Source
on Target.id=Source.id AND target.Manufactureid=source.Manufactureid
when matched then
update set Target.Model=Source.Model,
Target.NumDoors = Source.NumDoors,
Target.Description = Source.Description,
Target.LastUpdateTime = Source.LastUpdateTime,
Target.EngineSize = Source.EngineSize
when not matched then
INSERT ([Manufactureid]
,[Model]
,[NumDoors]
,[Description]
,[ID]
,[LastUpdateTime]
,[EngineSize])
VALUES
(Source.Manufactureid,
Source.Model,
Source.NumDoors,
Source.Description,
Source.ID,
Source.LastUpdateTime,
Source.EngineSize);
End
Workerロール内に、私は、オブジェクトモデルのエンティティフレームワークを使用しています: これは私のトリガーのコードです。原因SQLは、それぞれの新しい挿入/更新された行のためのIdentityScopeをバック報告しないように、私はこれがliklyであることを理解
OptimisticConcurrencyException
Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
:私はSaveChangesメソッドを呼び出すと、私は次の例外をreceieve。次に、行は挿入されず、トランザクションは最終的にコミットされていないとEFは考えます。
この例外を処理する最適な方法は何ですか?たぶん、SQLマージ関数からOUTPUTを使用して?
ありがとうございます! -Paul
そして、代わりの更新を行っている場合は、INSERT文の直前で "SET NOCOUNT OFF"を確認してから、それ以降は何も選択しないでください。 –
Answer –