2016-01-22 155 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

是的,這將是很好的,以確保實體不應被標記爲修改時,他們不應該 –