Как сначала создать / обновить поле с последними изменениями в коде EF

#c# #entity-framework #ef-code-first

#c# #entity-framework #ef-code-first

Вопрос:

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

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

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

Ответ №1:

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

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

    foreach (var entry in Context.ChangeTracker.Entries<ICreatedBy>().Where(x => x.State == EntityState.Added amp;amp; 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();
}
  

Комментарии:

1. для реализации этого требуется много интерфейсов, но это должно сработать.

2. Это интересное решение, но я ожидал упростить наш код! 🙂 Мы продолжим вручную обновлять поле в нашем текущем приложении (это всего лишь одна таблица, и она сохранена только из нескольких мест). Несмотря на это, я узнал несколько вещей, просмотрев ваш код, что всегда приятно! (И это может быть хорошим решением в будущем проекте). Спасибо!

Ответ №2:

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

Редактировать

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