捕获DbEntityValidationException并获取Entity Framework 6的EntityValidationErrors的常用位置

时间:2017-03-04 16:09:27

标签: c# entity-framework entity-framework-6

要从Entity Framework获取特定的验证错误消息,我必须将所有[DbContext] .SaveChanges()包装在Try / Catch中,例如:

public bool Delete(int id)
{
    using (var db = new MainContext())
    {

        db.Entry(new Borrower { Id = id }).State = EntityState.Deleted;

        try
        {
            db.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            ex.Data.Add("Validation_Errors_from_DbEntityValidationException", Common.LogMessageDbEntityValidationException(ex));
            throw;
        }
    }

    return true;
}

在Common.LogMessageDbEntityValidationException中,我这样做:

public static string LogMessageDbEntityValidationException(DbEntityValidationException ex)
{
    StringBuilder error = new StringBuilder();

    error.AppendLine("Validation Error details for DbEntityValidationException that has been throw: ");

    foreach (var validationErrors in ex.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            error.AppendLine(string.Format("Property: {0} , Error: {1}", validationError.PropertyName, validationError.ErrorMessage));
        }
    }

    return error.ToString();
}

如果我不这样做并且只捕获冒泡的错误,则EntityValidationErrors不可用于记录,这导致此级别的详细信息丢失。

在我的大型项目中,我有数百条这样的陈述。现在是否存在陷阱或在一个中心位置订阅此错误,例如实现DbContext的类?

1 个答案:

答案 0 :(得分:0)

您可以覆盖SaveChanges