[Entity Framework] 查看DbEntityValidationException發生原因

查看DbEntityValidationException發生原因

問題簡述

 

在使用Entity Framework處理資料時,常會用Try Catch將容易引發錯誤的SaveChanges方法包起來,當錯誤發生時就可以透過Exception了解錯誤造成起因。由於筆者使用Exception作為Catch Exception條件,當拋出DbEntityValidationException錯誤後,想進一步了解錯誤成因時,卻發現無法直接透過Exception至DbEntityValidationException中找出錯誤細節。那要如何處理呢? 以下將提供兩種方式依需求來選擇。

 

image

 

 

解決方案

 

 

方案一、使用DbEntityValidationException作為Catch例外之條件

 

如此即可精確地取出錯誤發生的原因, 如下表示Password及Name屬性為必要欄位,需要有資料才可寫入。

image

 

 

方案二、直接覆寫SaveChanges方法使其拋出有意義之訊息

 

首先覆寫DbContext的SaveChange方法 (強化錯誤訊息資訊)

{

    // ...

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            // Retrieve the error messages as a list of strings.
            var errorMessages = ex.EntityValidationErrors
                    .SelectMany(x => x.ValidationErrors)
                    .Select(x => x.ErrorMessage);

            // Join the list to a single string.
            var fullErrorMessage = string.Join("; ", errorMessages);

            // Combine the original exception message with the new one.
            var exceptionMessage = 
                      string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);

            // Throw a new DbEntityValidationException with the improved exception message.
            throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
        }
    }
}

 

最後仍可直接使用Exception作為Catch例外的條件,當錯誤發生時將獲得自行定義之完整資訊。

image

 

 

參考資訊

 

http://www.dotblogs.com.tw/jaigi/archive/2014/09/19/146616.aspx

http://stackoverflow.com/questions/15820505/dbentityvalidationexception-how-can-i-easily-tell-what-caused-the-error


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !