我想了解如何在插入时从 DBML 中的 Unique Key Violation 错误中恢复。
我的场景:
- 创建一个新的 DBML 映射对象(称为 A)(可能是重复的,但之前无法确定)并使用
InsertOnSubmit(A)
, - 然后在上下文中我调用
SubmitChanges(ConflictMode.ContinueOnConflict)
- 我发现错误并尝试通过以下方式解决所有冲突
OverwriteCurrentValues
- 当我重试时,
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 处理代码中使用的解决方案。在我提交更改之前,这应该运行多行并且每行具有十个或更多维度。我不介意独特的约束错误——它们意味着我想要插入的值已经在数据库中,我对此很满意。此处的下一步是每个维度的代理键替换以及事实表的插入或更新(未包含在此示例中)。