DBML如何从插入上的UNIQUE KEY冲突中恢复

本文关键字:KEY UNIQUE 冲突 恢复 插入 DBML | 更新日期: 2023-09-27 18:16:03

我想找出如何从唯一键违反错误在DBML上插入恢复。

我的场景:

  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处理代码。在我提交更改之前,这应该对多行运行,并且每行有十个或更多维度。我不介意唯一的约束错误-他们的意思是,我想要插入的值已经在数据库中,我很高兴。接下来的步骤是为每个维度替换代理键,并插入或更新事实表(不包括在本示例中)。

DBML如何从插入上的UNIQUE KEY冲突中恢复

首选的解决方案是:

        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();
        }