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

因此,当我插入重复的日期并且在第二次SubmitChanges()调用时抛出相同的异常时,这些问题永远不会解决。

如何从错误中恢复以成功调用SubmitChanges()

我正在寻找一种在更复杂的 ETL 处理代码中使用的解决方案。在我提交更改之前,这应该运行多行并且每行具有十个或更多维度。我不介意独特的约束错误——它们意味着我想要插入的值已经在数据库中,我对此很满意。此处的下一步是每个维度的代理键替换以及事实表的插入或更新(未包含在此示例中)。

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 回答