当我使用DataSet时,可能会在RowChanging、RowChanged、ColumnChanging、ColumnChanged等事件上引发事件...
如何在Entity Framework中使用实体执行相同的操作?
当我使用DataSet时,可能会在RowChanging、RowChanged、ColumnChanging、ColumnChanged等事件上引发事件...
如何在Entity Framework中使用实体执行相同的操作?
实体已经实现了PropertyChanged
事件,因为它们实现了System.ComponentModel.INotifyPropertyChanged
。如果您想捕获对实体的更改,只需订阅即可。
还要注意,实体支持以下两个部分方法,如果您想响应类内的更改,可以覆盖第二个方法,这将为您提供“RowChanging”的等效项:
protected override void OnPropertyChanged(string property) {}
protected override void OnPropertyChanging(string property) {}
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"));
}
}
test.hire_date = DateTime.Now;
N.B.
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; }
}