uncategorized

Entity Framework發生『Validation failed for one or more entities. See 'EntityValidationErrors' property for more details』

使用Entity Framework在處理資料存入資料庫是非常方便,但是缺點就是因為太自動幫我們都做好很多處理,導致有時候發生問題,就不知道問題在哪邊增加Debug的困難性,例如下圖,當我使用SaveChanges,就出現這個Exception,但是,這錯誤實在不知道在那邊,從這exception也無法明確地確定問題所在

不過,大概心裡有數因該是資料跟欄位上有問題,可是,以這個案例來說,資料表欄位超多,不可能一個欄位一個欄位去做確認,甚至是去比對資料。若是可以再多一些資訊,就更好了。從錯誤訊息是要我們去看EntityValidationErrors屬性去看更多資訊。千萬不要從原本的Exception去找EntityValidationErrors屬性,這樣根本還是找不到錯誤。因此,若之後有遇到這樣錯誤訊息,建議可以使用DbEntityValidationException類別幫忙我們找出問題

DbEntityValidationException 類別: Represents an exception thrown from SaveChanges() when the validation of entities fails.

從這個類別中就有EntityValidationErrors屬性可以使用了,就可以輕易找出問題所在

使用一個簡單範例,找出當錯誤發生時候,秀出Entity到底是哪邊出問題

1
2
3
4
5
6
7
8
catch (DbEntityValidationException ex)
{
var entityError = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
var getFullMessage = string.Join("; ", entityError);
var exceptionMessage = string.Concat(ex.Message, "errors are: ", getFullMessage);
//NLog
LogException(new Exception(string.Format("File : {0} {1}.", logFile.FullName, exceptionMessage), ex));
}