Как создать / обновить поле LastModified в EF Code First - PullRequest
3 голосов
/ 17 мая 2011

Я хочу добавить столбец, в котором хранится текущий DateTime, когда запись сохраняется на диск.Каков будет лучший способ сделать это?

Я знаю, что это не очень сложная проблема, но мне было интересно, есть ли какая-нибудь лучшая практика или какая-либо функция EF, которая бы упростила задачу.Например:

  • Есть ли способ включить логику для этого поля в таблицу Class, чтобы она автоматически обновлялась при сохранении на диск?
  • Есть ли какое-либо событие длязахватить при изменении или сохранении объекта?

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

одним из вариантов будет создание слоя репозитория и реализация собственных SaveChanges

public void SaveChanges()
{
    foreach (var entry in Context.ChangeTracker.Entries<ICreatedAt>().Where(x => x.State == EntityState.Added && x.Entity.CreatedAt == default(DateTime)))
            entry.Entity.CreatedAt = DateTime.Now;

    foreach (var entry in Context.ChangeTracker.Entries<ICreatedBy>().Where(x => x.State == EntityState.Added && x.Entity.CreatedBy == null))
        entry.Entity.CreatedBy = ContextManager.CurrentUser;

    foreach (var entry in Context.ChangeTracker.Entries<IModifiedAt>().Where(x => x.State == EntityState.Modified))
        entry.Entity.ModifiedAt = DateTime.Now;

    foreach (var entry in Context.ChangeTracker.Entries<IModifiedBy>().Where(x => x.State == EntityState.Modified))
        entry.Entity.ModifiedBy = ContextManager.CurrentUser;

    Context.SaveChanges();
}
0 голосов
/ 17 мая 2011

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

РЕДАКТИРОВАТЬ

Одним из решений, которое я выбрал для этого, было позволить всем моим сущностям наследовать от общего базового класса (например, EntityBase), который предоставляет методы BeforeSave () и AfterSave (), которые вы можете вызывать в своем пользовательском DbContext при переопределении метода SaveChanges ( посмотрите на ChangeTracker для всех измененных записей)

...