Есть ли способ зарегистрировать обратный вызов, который будет вызываться до того, как модель в EF7 будет сохранена в базе данных? Что я хочу сделать, так это установить свойство ModifiedBy и ModifiedDate, которое у меня есть на всех моделях. Я не так стараюсь делать это вручную перед каждым сохранением, поэтому я ищу еще один общий и автоматический способ.Entity Framework 7 SaveChanges
ответ
ChangeTracker.Entries()
позволяет получить все изменения сущности. Вы можете переопределить SaveChanges
в своем DbContext и установить измененные свойства, используя что-то вроде следующего кода.
public override int SaveChanges()
{
SetModifiedInformation();
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
SetModifiedInformation();
return await base.SaveChangesAsync(cancellationToken);
}
private void SetModifiedInformation()
{
foreach (var entityEntry in ChangeTracker.Entries())
{
var entity = entityEntry.Entity as ChangeTracking;
if (entity != null)
{
entity.ModifiedBy = "Get User Here";
entity.ModifiedTime = DateTime.Now;
}
}
}
Нужно ли проверять объект entityEntry.State! = EntityState.Unchanged && entityEntry.State! = EntityState.Detached? – Abris
Да, было бы хорошо убедиться, что объекты не помечены как измененные, если они не должны быть –
Вы видели [Сгенерировано свойства] (http://ef.readthedocs.org/en/latest/modeling/generated-properties.html)? –
Из того, что я понимаю, генерируемые свойства используются для обозначения того, что свойство может быть задано базой данных. Я хочу установить свойство в моем коде C# общим способом, который гарантирует, что это произойдет при каждом сохранении. – Abris