2016-01-22 209 views
3

有没有什么方法可以注册一个回调,在EF7中的模型保存到数据库之前会被调用?我想要做的是设置我在所有模型上的ModifiedBy和ModifiedDate属性。我没有那么热衷于在每次保存之前手动执行此操作,所以我正在寻找一些更通用和自动的方法。实体框架7 SaveChanges

+0

你见过[生成属性](http://ef.readthedocs.org/en/latest/modeling/generated-properties.html)吗? –

+0

从我的理解生成的属性用于标记该属性可以由数据库设置。我想以通用的方式在我的c#代码中设置属性,以确保它在每次保存时发生。 – Abris

回答

7

ChangeTracker.Entries()允许您获取所有实体更改。您可以在DbContext中覆盖SaveChanges,并使用类似下面的代码来设置修改后的属性。

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 aswell? – Abris

+0

是的,这将是很好的,以确保实体不应被标记为修改时,他们不应该 –