2013年3月28日 星期四

如何解決「一個或多個實體的驗證失敗。如需詳細資料,請參閱 'EntityValidationErrors' 屬性」的問題?

今天遇到「一個或多個實體的驗證失敗。如需詳細資料,請參閱 'EntityValidationErrors' 屬性」的錯誤
手上有的案例是發生在db的table的欄位明明已經加長了,卻忘了update entity的驗證機制
怎麼知道是什麼欄位出問題?
在你的app用debug mode,前端網頁觸發他,我們看一下exception物件有什麼描述吧:

 哇~~exception物件有這麼多屬性,怎麼找到問題出在哪?
 我已經先幫你找到了,先點'System.Data.Entity.Validation.DbEntityValidationExcetion'
 -->EntityValidationErros-->[0](看你有幾個error就都打開來看)-->ValiationError->[0]看一下其中的ErrorMessage 及propertiyName,就有明確的說明錯誤發生在哪,如圖
究竟是bug狠還是我們行?我們慢慢看下去吧....

 喏,你看到了吧,是你的table 欄位已經有加長了,而validation沒有改
打開你的edmx檔,看一下問題出在什麼地方吧:
看到了嗎? buyer_name的欄位只有10,而不是db中的50

一個方式是在edmx的設計畫面找個空白處點滑鼠右鍵,選「update model from database」
一個比較快的方式是直接修改這個MaxLength欄位,改成跟db中的table的欄位相同長度
改完了,別忘了做存檔及專案重建的動作

加映:日後如何加入驗證工作:
書上都有,不過為了方便copy,請直接參考這個鏈結
一例勝萬言:
====================================
This adds a metadata containing class to the class that was generated by the edmx:
[MetadataTypeAttribute(typeof(CustomerMetadata))]
public partial class Customer
{
}
and then you have the metadata class which has the metadata attributes:
internal sealed class CustomerMetadata
{
    public int ID;

    [Required]
    [StringLength(60)]
    public string Name;
}
================================

沒有留言:

張貼留言