Возможно, это не то, что вы ищете, но вы можете прочитать это сообщение в блоге , где я сделал аналогичное доказательство концепции ведения журнала / управления версиями базы данных.Я не использовал T4 (поэтому я думаю, что это, вероятно, не то, что вы ищете, но вы можете не найти лучшего решения) и сгенерированные сущности, но унаследовали все сущности от одной базовой сущности, которая имела управление версиямисвойства.По сути, я расширил DbContext, переопределив метод SaveChanges, и установил там свои свойства управления версиями:
foreach (var entry in this.ChangeTracker.Entries())
{
// Make sure that this customized save changes executes only for entities that
// inherit from our base entity (IEntity)
var entity = (entry.Entity as JEntity);
if (entity == null) continue;
switch (entry.State)
{
// In case entity is added, we need to set OriginalId AFTER it was saved to
// database, as Id is generated by database and cannot be known in advance.
// That is why we save reference to this object into insertedList and update
// original id after object was saved.
case System.Data.EntityState.Added:
entity.UserCreated = user;
entity.DateCreated = now;
insertedList.Add(entity);
break;
// Deleted entity should only be marked as deleted.
case System.Data.EntityState.Deleted:
if (!entity.IsActive(now))
{
invalidList.Add(entity);
continue;
}
entry.Reload();
entity.DateDeleted = now;
entity.UserDeleted = user;
break;
case System.Data.EntityState.Detached:
break;
case System.Data.EntityState.Modified:
if (!entity.IsActive(now))
{
invalidList.Add(entity);
continue;
}
entity.UserCreated = user;
entity.DateCreated = now;
JEntity newVersion = this.Set(entity.GetType()).Create(entity.GetType()) as JEntity;
newVersion = this.Set(entity.GetType()).Add(newVersion) as JEntity;
this.Entry(newVersion).CurrentValues.SetValues(entity);
this.Entry(entity).Reload();
entity.DateDeleted = newVersion.DateCreated;
entity.UserDeleted = user;
break;
case System.Data.EntityState.Unchanged:
break;
default:
break;
}
}
Ссылка для полного исходного кода на github приведена в статье.
Это решение использует ту же таблицу для текущейи прошлые версии сущностей, и я планирую улучшить эту концепцию, пытаясь поместить все «удаленные» версии сущностей в отдельную таблицу, которая будет закрытой для DbContext, и вся логика переноса элементов в историю будет сохранена.изменения.Этот способ позволил бы открытому общедоступному dbset содержать только текущие версии элемента, что позволило бы строить любые общие решения, подобные динамическим данным, поверх такого контекста.