【问题标题】:Handling exceptions for each entity in context.saveChanges()处理 context.saveChanges() 中每个实体的异常
【发布时间】:2018-07-09 10:41:16
【问题描述】:

是否可以为捆绑包中的每个实体获取保存失败的特定异常?

saveChanges() 的简单使用为所有 bandle 提供了一个例外。

这是我的带有 try-catch 块的代码。:

  foreach (EntityBase ent in response.Entities)
            {
                try
                {
                    //save each ent ?
                }
                catch (DbEntityValidationException ex){...}
                catch (DbUpdateException e) { ...}

                catch (Exception ex){...}
            }

【问题讨论】:

    标签: c# exception ado.net entity-framework-6


    【解决方案1】:

    每次对附加/跟踪的实体进行更改后,都需要调用 save changes。

    我建议不要这样做,因为它可能会根据您要提交的更改数量减慢您的应用程序。如果您确实决定这样做,并且在发生故障时想要回滚先前的更改,则需要在运行整个更改集后添加一个您提交/回滚的包装事务。您还必须在失败后手动分离/恢复更改,以便下一次更改时的下一次保存更改不会触发刚刚发生的上一次失败。执行后者的最简单方法可能是分离该实体或重新创建 DbContext 实例。


    如果您想在保存到 DbContext 之前验证,请查看之前的问题和答案。它无法捕获所有错误,例如对唯一索引的约束,但它可以捕获违反数据约束的任何错误,例如缺少必需的值:Validating entities before saving and removing from context

    【讨论】:

    • 那么我可以使用另一种替代方法,即保存后抛出异常,以提供有关失败实体的完整指示?
    • @user1012506 - 您必须执行上述操作并编写一些代码来累积每个异常,也许在一个通用的List<Exception> 中。完成所有更改尝试后,您可以使用列表中的相关详细信息引发自定义异常(取决于您要对其执行的操作)。
    【解决方案2】:

    这是在saveChanges()中控制实体的一种选择

    foreach (AbstractEntity ent in response.Entities)
                    {
                        //defining new Entry for context - action by state
                        ctx.Entry(ent).State = ent.getEntityState();
                        ctx.SaveChanges();
                        ctx.Entry(ent).State = EntityState.Detached;
                    } 
    
    
                    catch (Exception ex){
    string errorMessages = ex.InnerException.InnerException.ToString();
                    throw ex.InnerException.InnerException;}
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多