Как поднять событие на изменение недвижимости? - PullRequest
3 голосов
/ 11 апреля 2011

Когда я использую DataSet, есть возможность вызывать события для RowChanging, RowChanged, ColumnChanging, ColumnChanged и т. Д. ...

Как сделать то же самое с сущностью из Entity Framework?

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Объекты уже реализуют событие PropertyChanged, поскольку они реализуют System.ComponentModel.INotifyPropertyChanged.Если вы хотите отслеживать изменения в entieis, вы можете просто подписаться на это.

Также обратите внимание, что сущности поддерживают следующие два частичных метода - второй из которых должен дать вам эквивалент «RowChanging» - что выможно переопределить, если вы хотите ответить на изменения в вашего класса:

protected override void OnPropertyChanged(string property) {}

protected override void OnPropertyChanging(string property) {}
2 голосов
/ 17 сентября 2015

Вы можете сделать следующее, чтобы вызвать событие для свойства, измененного в 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"));
    }
}

Если вы запустите его, он будетпокажите

Дата проката изменена: 17.09.2015

на консоли, поскольку в основном методе мы изменили свойство с помощью:

test.hire_date = DateTime.Now;

NB

  • Чтобы удалить регистрацию события, вы можете использовать:test.PropertyChanged -= HandleSomethingHappening;
  • Как показано здесь , лямбды также разрешены;Например, вы можете использовать:test2.PropertyChanged +=(c, a) => Console.WriteLine(((System.ComponentModel.PropertyChangedEventArgs)a).PropertyName + " property has changed in employee entity");который будет обрабатывать то же событие, что и в примере выше.Но в этом случае отмена регистрации невозможна, поскольку вы не можете ссылаться на неявно созданную анонимную функцию
  • . Вы также можете использовать событие PropertyChanging, которое вызовет до изменения
  • Это не ограничивается Entity Framework, вы можете использовать его в каждом классе, как показывает эта статья 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 свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...