Вы можете сделать следующее, чтобы вызвать событие для свойства, измененного в Entity Framework: Предположим, у вас есть база данных Pubs - у нее есть таблица employee
со следующей структурой таблицы:
![Table employee in pubs database](https://i.stack.imgur.com/lUS1w.jpg)
Теперь мы хотим отслеживать любые изменения свойства 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
свойства.