簡體   English   中英

有沒有比使用Entity Framework + IDataErrorInfo更好的方法來實現模型驗證?

[英]Is there a better way to implement model validation with Entity Framework+IDataErrorInfo than this?

目前,我有這個:

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

然而,這是有效的:無論如何我可以將通用代碼移動到其他類嗎? 什么是最好的方法? 我們(在遷移到實體框架之前)曾經有過一個“實體”類和一個Poco。 此實體類從某些基類擴展,其中實現的接口類似於IDataErrorInfo。 因為部分類的其他部分已經從EntityObject擴展,我不能使用這種方法,但是我覺得愚蠢地再寫80%相同代碼的每個部分類。 唯一的“真正”差異是Validate方法的邏輯。

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM