我想了解如何在插入时从DBML中恢复唯一键违例错误。
我的情景:
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处理代码中使用的解决方案。在我提交更改之前,这应该针对多行和每行具有十个或更多维度。 我不介意唯一约束错误 - 它们意味着我想要插入的值已经在数据库中,我很满意。这里的后续步骤是每个维度的代理键替换以及事实表的插入或更新(本示例中未包括)。
答案 0 :(得分: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();
}