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

У меня есть несколько таблиц, в которых есть столбцы DateUpdated.

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

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

Вот мои идеи:

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

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

Есть идеи?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

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

0 голосов
/ 21 августа 2009

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

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