目前,我有這樣的:是否有更好的方法來使用實體框架+ 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;
}
}
好,研究一天之後/我的同事討論,我們去了不同的方式:流利的API +代碼第一種方法。 沒有更多的EDMX。 沒有更多的映射衝突。 不再有衝突的設計器文件。 只是一個很好的類,我們需要映射到我們的數據庫表和我們想要的所有自由。 – 2012-08-09 18:58:48