2011-04-11 95 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方法觸發。