SQL 2008 R2 11 月リリース データベースと .net 4.0 Beta 2 Azure worker ロール アプリケーションを使用します。worker ロールはデータを収集し、それを 1 つの ID 列を持つ単一の SQL テーブルに挿入します。この worker ロールのインスタンスが複数実行される可能性が高いため、SQL テーブルに Insert instead of トリガーを作成しました。トリガーは、SQL Merge 関数を使用して Upsert 機能を実行します。T-SQL を使用して、トリガー関数の代わりに挿入を正しく検証できました。既存の行が更新されている間に新しい行が挿入されました。これは私のトリガーのコードです:
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 ロール内では、オブジェクト モデルに Entity Framework を使用しています。SaveChanges メソッドを呼び出すと、次の例外が発生します。
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.
これは、新しく挿入/更新された行ごとに SQL が IdentityScope を報告しないことが原因である可能性が高いと理解しています。次に、EF は、行が挿入されておらず、トランザクションが最終的にコミットされていないと考えます。
この例外を処理する最善の方法は何ですか? 多分SQLマージ関数からのOUTPUTを使用していますか?
ありがとう!-ポール