0

挿入時に DBML の Unique Key Violation エラーから回復する方法を知りたいです。

私のシナリオ:

  1. 新しい DBML マップ オブジェクトを作成し (A と呼びます) (重複する可能性がありますが、以前は特定できません) InsertOnSubmit(A)
  2. 次に、コンテキストで私は呼び出しますSubmitChanges(ConflictMode.ContinueOnConflict)
  3. エラーをキャッチし、すべての競合を解決しようとしますOverwriteCurrentValues
  4. 再試行SubmitChangesすると、同じエラーが発生しました

コード:

var new_date_row = new dimension_date(); 
    // two columns: datetime date, identity key
new_date_row.Date = new DateTime(2014, 1, 1);
db_context.dimension_dates.InsertOnSubmit(new_date_row);

try
{
    db_context.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
}

db_context.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);
db_context.SubmitChanges(); // exception thrown here

その結果、重複した日付が挿入されていて、2 回目のSubmitChanges()呼び出しで同じ例外がスローされている場合、これらは解決されません。

エラーから正常に呼び出すにはどうすればよいSubmitChanges()ですか?

より複雑な ETL 処理コード内で使用するソリューションを探しています。これは、変更を送信する前に、複数の行と 10 個以上のディメンションを持つ各行に対して実行する必要があります。一意の制約エラーは気にしません。挿入したい値が既にデータベースにあることを意味し、それに満足しています。ここでの次のステップは、各ディメンションの代理キー置換と、ファクト テーブルの挿入または更新です (この例には含まれていません)。

4

1 に答える 1

0

これに対する好ましい解決策は次のとおりです。

        var date = new DateTime(2014, 1, 1);
        if (!db_context.dimension_dates.Any(x => x.Date == date))
        {
            var new_date_row = new dimension_date();
            // two columns: datetime date, identity key
            new_date_row.Date = date;
            db_context.dimension_dates.InsertOnSubmit(new_date_row);
            db_context.SubmitChanges();
        }
于 2014-08-01T14:27:51.327 に答える