当我使用DataSet时,有可能引发RowChanging,RowChanged,ColumnChanging,ColumnChanged等事件...如何举办物业变更活动?
如何对来自实体框架的实体做同样的事情?因为他们实施System.ComponentModel.INotifyPropertyChanged
当我使用DataSet时,有可能引发RowChanging,RowChanged,ColumnChanging,ColumnChanged等事件...如何举办物业变更活动?
如何对来自实体框架的实体做同样的事情?因为他们实施System.ComponentModel.INotifyPropertyChanged
实体已经落实PropertyChanged
事件。如果您想要更改您的内容,则可以订阅该内容。
还要注意的是实体支持以下两个部分的方法,其中第二个应该给你“RowChanging”相当于 - 即你可以重写,如果你想对变化类回应中:
protected override void OnPropertyChanged(string property) {}
protected override void OnPropertyChanging(string property) {}
谢谢,我似乎已经在某处看到了它。 但我不知道的是:如何“**订阅**”? 我应该在哪里做出改变才能做到这一点? 在“Entities.edmx/Entities.Designer.cs 我需要另一类 下面这个实例=> MyEntities DB =新MyEntities();???? ... 谢谢您的澄清。 – NIF 2011-04-13 09:30:16
您可以执行以下操作,以提高在实体框架改变了对财产的事件:假设你有酒馆数据库 - 它有一个表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
事件以及匿名函数,这将触发前的变化正在发生高级提示:
如果你想更好地了解正在发生的事情在幕后,我所提供的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
方法触发。
实体类不是数据集,你试图解决什么问题? – gandjustas 2011-04-11 14:45:10
这是一个重复的http://stackoverflow.com/questions/3460714/entity-framework-how-to-raise-onchanging-for-any-property? – NateTheGreat 2011-04-11 14:45:49
我已经发布了对您的问题[这里](http://stackoverflow.com/a/32626552/1016343)的答案,展示了如何订阅该事件以及EF如何处理事件。 – Matt 2015-09-18 08:49:19