Я пытаюсь выполнить «общий» механизм обновления временных данных в моей базе данных SQL Server с использованием Entity Framework.Реализация «универсального» механизма обработки временных данных в Entity Framework
То, что я сделал, это создать «маркерный» интерфейс под названием ITemporalData
, который определяет два свойства, которые должны быть представлены - DateTime ValidFrom
и DateTime? ValidTo
.
public interface ITemporalData
{
DateTime ValidFrom { get; set; }
DateTime? ValidTo { get; set; }
}
Я надеялся реализовать «общий» подход в моем DbContext.SaveChanges()
переопределение для:
- клон любой
ITemporalData
объект, который дал бы мне новый объект для хранения (EntityState.Added
), и установите егоValidFrom
значение до текущей даты & время - сбрасывает исходную, измененную запись в ее значения базы данных (вызывает
.Reset()
на объекте), а затем устанавливаетValidTo
для этой «старой» записи текущая дата & время
В то время как я могу легко отфильтровать измененные ITemporalData
объекты в SaveChanges()
переопределение, как это:
public partial class MyDbContext
{
// override the "SaveChanges" method
public override int SaveChanges()
{
DateTime currentDateTime = DateTime.Now;
// get the modified entities that implement the ITemporalData interface
IEnumerable<DbEntityEntry<ITemporalData>> temporalEntities = ChangeTracker.Entries<ITemporalData>().Where(e => e.State == EntityState.Modified);
foreach (var temporalEntity in temporalEntities)
{
// how would I do that, really? I only have an interface - can't clone an interface......
var cloned = temporalEntity.Entity.Clone();
// and once it's cloned, I would need to add the new record to the correct DbSet<T> to store it
// set the "old" records "ValidTo" property to the current date&time
temporalEntity.Entity.ValidTo = currentDateTime;
}
return base.SaveChanges();
}
}
Я борющегося с «клонировать измененную запись» подход - I есть только интерфейс ITemporalData
, но клонирование (с использованием AutoMapper или других подходов) всегда зависит от фактического, лежащего ниже бетонного типа .....
В чем проблема с клонированием? Вы можете создать новый экземпляр с помощью отражения и скопировать propeties из вашего temporalEntity (снова через отражение) к нему, а не? – Evk
@Evk: Хорошо, так что если это работает (еще не совсем убежден ...) - как добавить этот новый экземпляр в * правильный * 'DbSet' в моем контексте? Как я могу это узнать? –
Вы могли бы использовать триггер db? Я использовал их для автоматического управления версиями. –