2016-01-22 6 views
3

Есть ли способ зарегистрировать обратный вызов, который будет вызываться до того, как модель в EF7 будет сохранена в базе данных? Что я хочу сделать, так это установить свойство ModifiedBy и ModifiedDate, которое у меня есть на всех моделях. Я не так стараюсь делать это вручную перед каждым сохранением, поэтому я ищу еще один общий и автоматический способ.Entity Framework 7 SaveChanges

+0

Вы видели [Сгенерировано свойства] (http://ef.readthedocs.org/en/latest/modeling/generated-properties.html)? –

+0

Из того, что я понимаю, генерируемые свойства используются для обозначения того, что свойство может быть задано базой данных. Я хочу установить свойство в моем коде C# общим способом, который гарантирует, что это произойдет при каждом сохранении. – Abris

ответ

7

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; 
     } 
    } 
} 
+0

Нужно ли проверять объект entityEntry.State! = EntityState.Unchanged && entityEntry.State! = EntityState.Detached? – Abris

+0

Да, было бы хорошо убедиться, что объекты не помечены как измененные, если они не должны быть –