「EF」db.SaveChanges()的時候發生EntityValidationErrors的錯誤(DbEntityValidationException)

  • 1105
  • 0
  • 2019-09-26

「EF」db.SaveChanges()的時候發生EntityValidationErrors的錯誤(DbEntityValidationException)

有時候利用EF直接存取資料庫的時候,可能會發生錯誤,也許是資料長度超過欄位長度,也許是把字串欄位存到數字欄位去。。。。等等

雖然只要利用try catch以及Exception的類別去擷取錯誤,就可以透過程式碼下中斷點並將exception「加入監看式」,就可以在檢查到底是哪個欄位存進去db的時候出了問題,不過實務上使用者會希望能馬上看到錯誤的細節,因此不可能還要將此錯誤forward給原本的程式設計師並下中斷點去找錯誤,這樣子太慢了!

因此就需要在db.SaveChanges()執行發生錯誤的時候,立刻顯示詳細內容,其實很簡單,只要try catch改用DbEntityValidationException類別去擷取錯誤,就可以直接透過DbEntityValidationException.EntityValidationErrors屬性,直接列印出錯誤內容囉!

using (MyEntities db = new MyEntities())
{
	db.myTable.Add(item);
	try
	{
		db.SaveChanges();
	}
	//利用DbEntityValidationException抓取ValidationErrors
	//如果是用傳統的Exception類別,沒辦法直接在程式碼抓ValidationErrors
	catch (DbEntityValidationException ex)
	{			
		//丟出ex內容
		var validationErrors = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);                                
		var errMsgs = string.Join("; ", validationErrors);		
		return errMsgs.ToString();
	}
	
}

參考文章:
http://edwardkuo.imas.tw/paper/2016/08/27/Net/2016-08-27/