如何引发有关财产变更的事件?

问题描述 投票:0回答:2

当我使用 DataSet 时,有可能引发 RowChanging、RowChanged、ColumnChanging、ColumnChanged 等事件...

如何对实体框架中的实体执行相同的操作?

c# entity-framework dataset linqpad
2个回答
5
投票

实体自从实现了

PropertyChanged
以来就已经实现了
System.ComponentModel.INotifyPropertyChanged
事件。 如果您想了解您的实体的变化,您只需订阅即可。

另请注意,实体支持以下两个部分方法(其中第二个方法应为您提供相当于“RowChanging”的功能),如果您想响应类中的更改,则可以重写它们:

protected override void OnPropertyChanged(string property) {}

protected override void OnPropertyChanging(string property) {}

3
投票

您可以执行以下操作来引发有关 Entity Framework 中更改的属性的事件: 假设您有 Pubs 数据库 - 它有一个表

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
    事件,该事件将在 before 更改发生之前触发
  • 这不仅限于实体框架,您可以在每个类中使用它,如这篇SO文章所示。

高级提示:

如果您想更好地了解幕后发生的事情,我提供了

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
方法中触发。

© www.soinside.com 2019 - 2024. All rights reserved.