Как я могу автоматически установить столбец DateUpdated, используя Entity Framework?

2

У меня есть куча таблиц с столбцами DateUpdated.

Как я могу автоматически настроить эти поля на DateTime.Now, когда объекты сохраняются обратно в хранилище данных при вызове SaveChanges().

Мне не нужно делать это по всем правилам с помощью одного кода. Я был бы в порядке с добавлением обработчиков событий во всех частичных классах, но я не видел ничего, что мог бы подключить. И я предпочел бы сохранить его в коде, а не добавлять триггеры в базу данных.

Вот мои идеи:

Я думаю, что могу сделать какое-то безумное отражение в событии ObjectContext.SavingChanges, но я не думаю, что это лучшее решение.

Или я мог бы добавить интерфейс, содержащий свойство DateUpdated, и реализовать его со всеми классами, которые имеют это поле. Затем используйте событие ObjectContext.SavingChanges, чтобы установить свойство на всех измененных объектах, реализующих этот интерфейс.

Любые идеи?

Спасибо заранее!

Теги:
sql-server
entity-framework
objectcontext

2 ответа

3
Лучший ответ

Это один из тех чрезвычайно редких случаев, когда я думаю, что триггеры базы данных действительно имеют некоторую полезность. Обычно я их сильно не люблю... у них есть привычка скрывать бизнес-логику в самом темном углу системы. Однако, для чего-то столь же простого, как последняя измененная дата, я думаю, что они могут быть самым простым, наиболее масштабируемым и наиболее эффективным решением в целом.

0

Лично я хотел бы создать пользовательский объект для наследования моих таблиц. Вы можете установить базовый тип для своих таблиц на этот объект, а затем играть с ним оттуда. Это позволяет переопределить 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, как только будет изменено какое-либо свойство.

  • 0
    К сожалению, я думаю, что событие OnPropertyChanged срабатывает каждый раз, когда объект изменяется, даже когда данные загружаются. Поэтому я думаю, что выполнение выбора приведет к обновлению поля в этом случае.
  • 0
    Это нормально. Дальнейшие эксперименты показывают, что базовый тип жестко привязан к табличным объектам в одной модели, что делает его бесполезным для этой цели. Намного проще в Linq для SQL. <Вздохнуть>
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню