有两部分内容。一部分是变更通知事件,另一部分是维护历史记录。Entity Framework 和 LINQ to SQL 都实现了这一点,我也在自己的代码中实现了。至少,您需要为成员保留一个标志来表示它已更改。根据您的要求,您可能还需要保留原始值。这通常成为一个单独的对象的任务。Entity Framework 在一个独立的对象(如果我记得正确的话是 EntityState)中保持其更改跟踪。
在我的代码中,我开发了一个“DataMember”类,不仅保存了值,还保持了更改标志、空状态和其他各种有用的东西。这些 DataMembers 是 Entity 类中的私有成员,并且 Entity 提供了将数据公开为简单数据类型的属性。属性的 get 和 set 方法与 DataMember 交互以“做正确的事情”,但 DataMember 进行更改跟踪。我的 Entity 类继承自“EntityBase”类,该类提供了检查实体级别更改的方法、接受更改(重置更改标志)等方法。添加更改通知将是我下一个要做的事情,但使用 DataMember 类来处理单个数据元素以及拥有更改通知事件处理程序的 EntityBase 将大大简化此过程。
以下是我的 DataMember 类的接口定义的代码示例:
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();
}
}
请注意,DataMember可以支持可为空或非空属性。
添加DataMember的构造函数代码:
m_Monday = new DataMember<bool>("Monday");
Members.Add(m_Monday);