#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 для всех измененных записей)