2012-08-09 77 views
3

目前,我有這樣的:是否有更好的方法來使用實體框架+ IDataErrorInfo實現模型驗證比這個更好?

    通過實體框架
  • 生成的模型部分類
  • 我自己的部分類實現IDataErrorInfo的接口

但是這個工作,這個實體的:反正是有我可以將通用代碼移動到其他類嗎?什麼是最好的方法?我們(在轉移到實體框架之前)曾經有一個「實體」類和一個Poco。這個實體類從一些基類中擴展,其中的接口在那裏實現了像IDataErrorInfo。因爲部分類的其他部分已經從EntityObject擴展了,所以我不能使用這種方法,但我覺得每個部分類再次使用相同的代碼編寫80%是愚蠢的。唯一的「真正的」區別是驗證方法的邏輯。

public partial class Customer : IDataErrorInfo, ICustomer 
{ 
    private readonly IDictionary<string, string> _errors = new Dictionary<string, string>(); 

    public Customer() 
    { 
     base. 
     PropertyChanged += Model_PropertyChanged; 
    } 

    private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     Validate(); 
    } 

    private void Validate() 
    { 
     if (Name != null && Name.Equals("Banana")) 
     { 
      this[GetPropertyName(() => Name)] = "Some really nice error here"; 
     } 
    } 

    #region "IDataErrorInfo" 

    public virtual string this[string columnName] 
    { 
     get 
     { 
      if (_errors.ContainsKey(columnName)) 
      { 
       return _errors[columnName]; 
      } 
      return null; 
     } 
     protected set 
     { 
      if (value == null && _errors.ContainsKey(columnName)) 
      { 
       _errors.Remove(columnName); 
      } 
      else 
      { 
       if (_errors.ContainsKey(columnName)) 
        _errors[columnName] = value; 
       else 
        _errors.Add(columnName, value); 
      } 
     } 
    } 

    public virtual string Error 
    { 
     get 
     { 
      if (_errors.Values.Count > 0) 
      { 
       return _errors.Values.First(); 
      } 
      return null; 
     } 
    } 
    #endregion 

    public static string GetPropertyName<T>(Expression<Func<T>> expression) 
    { 
     MemberExpression body = (MemberExpression)expression.Body; 
     return body.Member.Name; 
    } 
} 
+0

好,研究一天之後/我的同事討論,我們去了不同的方式:流利的API +代碼第一種方法。 沒有更多的EDMX。 沒有更多的映射衝突。 不再有衝突的設計器文件。 只是一個很好的類,我們需要映射到我們的數據庫表和我們想要的所有自由。 – 2012-08-09 18:58:48

回答

相關問題