Одним из возможных решений (которое мы используем в настоящее время там, где я работаю) является переопределение метода SaveChanges()
в DbContext и добавление небольшого кода для циклического просмотра измененных объектов, устанавливающих значения
public override int SaveChanges()
{
var changedEntriesCopy = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added ||
e.State == EntityState.Modified ||
e.State == EntityState.Deleted)
.ToList();
var saveTime = DateTime.Now;
foreach (var entityEntry in changedEntriesCopy)
{
if (entityEntry.Metadata.FindProperty("Created") != null && entityEntry.Property("Created").CurrentValue == null)
{
entityEntry.Property("Created").CurrentValue = saveTime;
}
if (entityEntry.Metadata.FindProperty("Updated") != null)
{
entityEntry.Property("Updated").CurrentValue = saveTime;
}
}
return base.SaveChanges();
}
Наша ситуация в основном настроена примерно так: создание в нашей ситуации обнуляется, так что при создании новой сущности значение в коде равно нулю до создания (что позволяет легко проверить, заполнялось ли когда-либо созданное).
Могут быть и другие решения, но это было проще всего настроить для нас, и не оказало заметного влияния на производительность