У меня есть куча таблиц с столбцами DateUpdated.
Как я могу автоматически настроить эти поля на DateTime.Now
, когда объекты сохраняются обратно в хранилище данных при вызове SaveChanges()
.
Мне не нужно делать это по всем правилам с помощью одного кода. Я был бы в порядке с добавлением обработчиков событий во всех частичных классах, но я не видел ничего, что мог бы подключить. И я предпочел бы сохранить его в коде, а не добавлять триггеры в базу данных.
Вот мои идеи:
Я думаю, что могу сделать какое-то безумное отражение в событии ObjectContext.SavingChanges, но я не думаю, что это лучшее решение.
Или я мог бы добавить интерфейс, содержащий свойство DateUpdated
, и реализовать его со всеми классами, которые имеют это поле. Затем используйте событие ObjectContext.SavingChanges, чтобы установить свойство на всех измененных объектах, реализующих этот интерфейс.
Любые идеи?
Спасибо заранее!
Это один из тех чрезвычайно редких случаев, когда я думаю, что триггеры базы данных действительно имеют некоторую полезность. Обычно я их сильно не люблю... у них есть привычка скрывать бизнес-логику в самом темном углу системы. Однако, для чего-то столь же простого, как последняя измененная дата, я думаю, что они могут быть самым простым, наиболее масштабируемым и наиболее эффективным решением в целом.
Лично я хотел бы создать пользовательский объект для наследования моих таблиц. Вы можете установить базовый тип для своих таблиц на этот объект, а затем играть с ним оттуда. Это позволяет переопределить OnPropertyChanged, чтобы он выполнялся всякий раз, когда какое-либо свойство было изменено в таблице. Это особенно полезно, если вы можете рассчитывать на соглашение о том, что интересующее вас поле называется "DateUpdated". Это потребует некоторой незначительной магии отражения, но не очень много.
using System.Reflection;
public class TableBase : System.Data.Objects.DataClasses.EntityObject
{
protected override void OnPropertyChanged(string property)
{
base.OnPropertyChanged(property);
if (property != "DateUpdated")
{
PropertyInfo prop = this.GetType().GetProperty("DateUpdated");
if (prop != null && prop.PropertyType.IsAssignableFrom(typeof(DateTime)))
{
prop.SetValue(this, DateTime.Now, null);
}
}
}
}
Установите базовый тип таблиц в TableBase и, если у них есть свойство "DateUpdated", это свойство станет Datetime.Now, как только будет изменено какое-либо свойство.