DBML如何从插入时违反UNIQUE KEY恢复?

时间:2014-08-01 14:08:47

标签: c# sql-server dbml insertonsubmit

我想了解如何在插入时从DBML中恢复唯一键违例错误。

我的情景:

  1. 创建一个新的DBML映射对象(称之为A)(可能是重复但之前无法确定)并使用InsertOnSubmit(A)
  2. 然后在上下文中,我致电SubmitChanges(ConflictMode.ContinueOnConflict)
  3. 我发现错误并尝试通过OverwriteCurrentValues
  4. 解决所有冲突
  5. 当我重试SubmitChanges时,我收到同样的错误
  6. 代码:

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

1 个答案:

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