這有兩個部分。變更通知事件是一件事,但保持歷史是另一件重要的事情。實體框架也是這樣做的(就像LINQ to SQL一樣),我也在自己的代碼中實現了這一點。至少,你保持一個成員的標誌,說它已經改變了。根據您的要求,您也可以保留原始值。這通常成爲單獨對象的任務。實體框架將其更改跟蹤保存在單獨的對象中(如果我沒有記錯的話,EntityState)。
在我自己的代碼中,我開發了一個「DataMember」類,它不僅保存了值,還保存了更改標記,空狀態以及其他各種有用的東西。這些DataMembers是實體類中的私有成員,並且實體提供了將數據作爲簡單數據類型公開的屬性。屬性get和set方法與DataMember交互以「做正確的事情」,但DataMember確實改變了跟蹤。 My Entity類繼承自「EntityBase」類,該類提供了在實體級別檢查更改的方法,接受更改(重置更改標誌)等。添加更改通知將是我所做的下一件事,但具有用於個人的DataMember類數據元素和一個EntityBase來擁有更改通知事件處理程序,這將簡化很多。
編輯補充:
現在,我在工作,我可以添加一些代碼樣本。下面是我的數據成員的類接口定義:
public interface IDataMember<T> : IDataMember
{
T Value { get; set; }
T Get();
void Set(T value);
}
public interface IDataMember
{
string FieldName { get; set; }
string OracleName { get; set; }
Type MemberType { get; }
bool HasValue { get; set; }
bool Changed { get; set; }
bool NotNull { get; set; }
bool PrimaryKey { get; set; }
bool AutoIdentity { get; set; }
EntityBase Entity { get; set;}
object GetObjectValue();
void SetNull();
}
這裏的實體類中的典型屬性:
private DataMember<bool> m_Monday;
public bool? Monday
{
get
{
if (m_Monday.HasValue)
return m_Monday.Get();
else
return null;
}
set
{
if (value.HasValue)
m_Monday.Set(value.Value);
else
m_Monday.SetNull();
}
}
注意,數據成員可以支持性能可爲空,或者不是。
構造函數代碼添加一個數據成員:的
m_Monday = new DataMember<bool>("Monday");
Members.Add(m_Monday);
可能重複【什麼是說,如果一個對象被修改的最佳方法?(http://stackoverflow.com/questions/34809/what-是最好的方式來告訴,如果一個對象被修改) – mathieu 2012-08-16 12:29:04