2011-04-11 54 views
3

当我使用DataSet时,有可能引发RowChanging,RowChanged,ColumnChanging,ColumnChanged等事件...如何举办物业变更活动?

如何对来自实体框架的实体做同样的事情?因为他们实施System.ComponentModel.INotifyPropertyChanged

+0

实体类不是数据集,你试图解决什么问题? – gandjustas 2011-04-11 14:45:10

+1

这是一个重复的http://stackoverflow.com/questions/3460714/entity-framework-how-to-raise-onchanging-for-any-property? – NateTheGreat 2011-04-11 14:45:49

+0

我已经发布了对您的问题[这里](http://stackoverflow.com/a/32626552/1016343)的答案,展示了如何订阅该事件以及EF如何处理事件。 – Matt 2015-09-18 08:49:19

回答

4

实体已经落实PropertyChanged事件。如果您想要更改您的内容,则可以订阅该内容。

还要注意的是实体支持以下两个部分的方法,其中第二个应该给你“RowChanging”相当于 - 即你可以重写,如果你想对变化类回应中

protected override void OnPropertyChanged(string property) {} 

protected override void OnPropertyChanging(string property) {} 
+0

谢谢,我似乎已经在某处看到了它。 但我不知道的是:如何“**订阅**”? 我应该在哪里做出改变才能做到这一点? 在“Entities.edmx/Entities.Designer.cs 我需要另一类 下面这个实例=> MyEntities DB =新MyEntities();???? ... 谢谢您的澄清。 – NIF 2011-04-13 09:30:16

1

您可以执行以下操作,以提高在实体框架改变了对财产的事件:假设你有酒馆数​​据库 - 它有一个表employee具有以下表结构:

Table employee in pubs database

现在,我们要跟踪的财产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;
  • 如图here,lambda表达式也是允许的;例如你可以使用:
    test2.PropertyChanged +=
    (c, a) => Console.WriteLine(((System.ComponentModel.PropertyChangedEventArgs)a).PropertyName + " property has changed in employee entity");
    这将处理同样的事件如上面的例子。但是,在这种情况下,注销登记是不可能的,因为你不能引用隐式创建
  • 可以使用PropertyChanging事件以及匿名函数,这将触发前的变化正在发生
  • 这不仅限于到实体框架,您可以在this SO article显示的每个课程中使用它。

高级提示:

如果你想更好地了解正在发生的事情在幕后,我所提供的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方法触发。