当我使用 DataSet 时,有可能引发 RowChanging、RowChanged、ColumnChanging、ColumnChanged 等事件...
如何对实体框架中的实体执行相同的操作?
实体自从实现了
PropertyChanged
以来就已经实现了 System.ComponentModel.INotifyPropertyChanged
事件。 如果您想了解您的实体的变化,您只需订阅即可。
另请注意,实体支持以下两个部分方法(其中第二个方法应为您提供相当于“RowChanging”的功能),如果您想响应类中内的更改,则可以重写它们:
protected override void OnPropertyChanged(string property) {}
protected override void OnPropertyChanging(string property) {}
您可以执行以下操作来引发有关 Entity Framework 中更改的属性的事件: 假设您有 Pubs 数据库 - 它有一个表
employee
,其表结构如下:
现在我们想要跟踪属性的任何更改
hire_date
。您可以按照以下方式执行此操作(此示例可以在 LinqPad 中轻松使用 - 您只需定义 EF 数据源,然后就可以运行该示例):
void Main()
{
var test=new employee();
test.PropertyChanged += HandleSomethingHappening;
test.hire_date = DateTime.Now;
}
public void HandleSomethingHappening(object sender, EventArgs e)
{
var propName=((System.ComponentModel.PropertyChangedEventArgs)e).PropertyName;
var empObj=(employee)sender;
if (propName=="hire_date")
{
Console.WriteLine(propName+" changed to: " + empObj.hire_date.Date.ToString("d"));
}
}
如果你运行它,它会显示
雇用日期已更改:2015 年 9 月 17 日
在控制台上,因为在 main 方法中我们通过以下方式更改了属性:
test.hire_date = DateTime.Now;
注意。
test.PropertyChanged -= HandleSomethingHappening;
test2.PropertyChanged +=
(c, a) => Console.WriteLine(((System.ComponentModel.PropertyChangedEventArgs)a).PropertyName + " property has changed in employee entity");
PropertyChanging
事件,该事件将在 before 更改发生之前触发高级提示:
如果您想更好地了解幕后发生的事情,我提供了
employee
类的简化代码(仅是运行上面示例所需的属性和事件):
public class employee //: EntityObject
{
#region Primitive Properties
public global::System.DateTime hire_date
{
get
{
return _hire_date;
}
set
{
//Onhire_dateChanging(_hire_date);
_hire_date=value;
Onhire_dateChanged();
}
}
private DateTime _hire_date;
void Onhire_dateChanged()
{
var handler = this.PropertyChanged; // copy before access (to aviod race cond.)
if (handler != null)
{
var args=new PropertyChangedEventArgs() { PropertyName="hire_date" };
handler(this, (System.EventArgs)args);
}
}
public event EventHandler PropertyChanged;
#endregion
}
public class PropertyChangedEventArgs: System.EventArgs
{
public string PropertyName { get; set; }
}
您可以看到事件是如何连接的 - 它在属性的
set
方法中触发。