2012-08-09 76 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

回答

相关问题