查看DbEntityValidationException發生原因
問題簡述
在使用Entity Framework處理資料時,常會用Try Catch將容易引發錯誤的SaveChanges方法包起來,當錯誤發生時就可以透過Exception了解錯誤造成起因。由於筆者使用Exception作為Catch Exception條件,當拋出DbEntityValidationException錯誤後,想進一步了解錯誤成因時,卻發現無法直接透過Exception至DbEntityValidationException中找出錯誤細節。那要如何處理呢? 以下將提供兩種方式依需求來選擇。
解決方案
方案一、使用DbEntityValidationException作為Catch例外之條件
如此即可精確地取出錯誤發生的原因, 如下表示Password及Name屬性為必要欄位,需要有資料才可寫入。
方案二、直接覆寫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例外的條件,當錯誤發生時將獲得自行定義之完整資訊。
參考資訊
http://www.dotblogs.com.tw/jaigi/archive/2014/09/19/146616.aspx
希望此篇文章可以幫助到需要的人
若內容有誤或有其他建議請不吝留言給筆者喔 !