当我使用DataSet时,有可能在RowChanging,RowChanged,ColumnChanging,ColumnChanged等上引发事件......
如何对实体框架中的实体做同样的事情?
答案 0 :(得分:4)
实体已实施PropertyChanged
事件,因为它们实施System.ComponentModel.INotifyPropertyChanged
。如果你想捕捉你的内容的变化,你可以订阅它。
另请注意,实体支持以下两种部分方法 - 第二种方法应该为您提供相当于“RowChanging”的功能 - 如果您想在中回复中的更改,则可以覆盖类:
protected override void OnPropertyChanged(string property) {}
protected override void OnPropertyChanging(string property) {}
答案 1 :(得分:2)
您可以执行以下操作来针对实体框架中更改的属性引发事件:假设您拥有 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"));
}
}
如果您运行它,它将显示
控制台上的雇用日期已更改:17.09.2015
,因为在main方法中我们通过以下方式更改了属性:
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
事件,这会在发生更改之前触发 高级提示:
如果你想更好地了解幕后发生的事情,我提供了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
方法中触发。