1. 程式人生 > >一例對一個或多個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性的解決

一例對一個或多個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性的解決

tro https span cep 實例 tps lte .data 防止

這個問題相信只要是做MVC的,都碰到過,也都知道錯誤的原因,就是觸發了定義的實例字段校驗規則。比如定義的不為空,但是為空了,或者定義的字段長度為50,但是超過50了。

可是有時雖然知道是這樣,但是具體問題解決的時候還是無從下手。我最近就碰到一個,知道是在更新某個表的時候出現的這個問題。可是在本地無法具現此錯誤,這個錯誤是在特定條件發生的,我並不知道此特定發生條件是什麽,很郁悶。

在網上找了下,知道發生這個錯誤會觸發DbEntityValidationException異常,這個異常會有詳細的異常信息說明是哪個字段,出現了什麽錯誤,只不過需要循環輸出。打算輸出到日誌文件中看是什麽錯誤。代碼如下:

[csharp] view plain copy
  1. try
  2. {
  3. es2.Update(examList);
  4. }
  5. catch (DbEntityValidationException dbEx)
  6. {
  7. foreach (var validationErrors in dbEx.EntityValidationErrors)
  8. {
  9. foreach (var validationError in validationErrors.ValidationErrors)
  10. {
  11. EventLog.Log(string.Format("Class: {0}, Property: {1}, Error: {2}", validationErrors.Entry.Entity.GetType().FullName,
  12. validationError.PropertyName,
  13. validationError.ErrorMessage), "error");
  14. }
  15. }
  16. throw;
  17. }
  18. catch (Exception ex)
  19. {
  20. throw;
  21. }

之所以用2個catch,是為了防止有其他非DbEntityValidationException 錯誤時,沒有錯誤日誌。

DbEntityValidationException所在命名空間:System.Data.Entity.Validation

編譯,上傳到服務器,過了一會,查看日誌文件,找到錯誤原因了。

Class: System.Data.Entity.DynamicProxies.ExamList_839A196D8FC4CF7E8A791B7F29782BA535E73532A1C3C2C00FD6EF30B6C4A660, Property: StudentAnswer, Error: 字段 StudentAnswer 必須是最大長度為 50 的字符串。
是StudentAnswer 字段長度不夠了。找到答案就好辦了。擴大字段大小,問題解決

一例對一個或多個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性的解決