Theme NexT works best with JavaScript enabled

ShunNien's Blog

不積跬步,無以致千里;不積小流,無以成江海。

0%

DbEntityValidationException 取得詳細錯誤訊息

前言

EF(EntityFramework) 的錯誤訊息通常都要在往下挖才會找到想要找尋的實際錯誤資訊,沒想到現在6.0以上版本有這DbEntityValidationException類別,好好記錄一下。

問題&處理

通常我們碰到 EF 的問題時都會以下這樣的情形,真的是很難處理
Exception
要處理這些問題,要嘛就是多處理幾次,就會知道問題點在哪裡,不然就是裝些輔助工具把 EF 的訊息拉出來查看,現在有這個DbEntityValidationException類別可以快速取出想要得知的訊息。
使用方式直接替換Exception就好,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;

if (EntitiesHelper.EntitiesSetting.SetSystemFieldsEnabled)
{
SystemFieldsHelper.SetSystemFields(objectContext);
}
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
throw ex;
}

但是這樣的方式,請看以下圖片,還是要往下層撈取
DbEntityValidationException
所以,可以稍微變動一下,讓訊息出來的更明顯,詳細的步驟可以參考E.K 開發紀事或是搞搞就懂

stackoverflowlink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public partial class SomethingSomethingEntities
{
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);
}
}
}

參考資料

歡迎關注我的其它發布渠道