这有两个部分。变更通知事件是一件事,但保持历史是另一件重要的事情。实体框架也是这样做的(就像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