DBML如何从插入上的UNIQUE KEY冲突中恢复
本文关键字:KEY UNIQUE 冲突 恢复 插入 DBML | 更新日期: 2023-09-27 18:16:03
我想找出如何从唯一键违反错误在DBML上插入恢复。
我的场景:
- 创建一个新的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处理代码。在我提交更改之前,这应该对多行运行,并且每行有十个或更多维度。我不介意唯一的约束错误-他们的意思是,我想要插入的值已经在数据库中,我很高兴。接下来的步骤是为每个维度替换代理键,并插入或更新事实表(不包括在本示例中)。
首选的解决方案是:
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();
}