2017-02-20 62 views
1

我的應用程序是使用EF6 數據庫第一個的方法。數據庫中的所有實體都有2個公共屬性「CreatedDateTime」和「ModifiedDateTime」。在實體框架中隱式設置公共屬性6

當前當我做SaveChanges()即時明確設置這兩個屬性的基礎上,如果我創建新的實體或更新現有的實體。

如果它的一個新實體然後設置了兩個屬性,否則只設置ModifiedDateTime屬性。

我想知道是否有辦法在保存或更新操作中隱式設置這兩個屬性?

更新1
我知道我必須覆蓋的SaveChanges()方法,但這裏真正的問題是調用SaveChanges需要訪問這些2個屬性。所以我只在這裏看到2個選項:
1>使用反射來查找實體是否具有這些屬性並進行設置。
2>修改默認的T4代,以便它派生所有具有預定義接口的實體。而這個界面將有這2個屬性。 SaveChanges()方法可以檢查實體是否從此接口派生並設置屬性。

我堅決不想使用選擇1使用反射。

在DB第一種方法中,有沒有其他的方式或者有人做過這個?

+0

public interface IChangeTrack { /// <summary> /// When has this entry be created /// </summary> [Required] DateTime CreatedDateTime { get; set; } /// <summary> /// When has this entry been modified /// </summary> DateTime? ModifiedDateTime { get; set; } } 

通過做這樣的事情現在覆蓋你SaveChanges()常規請參閱http://stackoverflow.com/a/7041363/106866和http://stackoverflow.com/a/7041323/106866 – jao

+0

我在尋找數據庫第一種方法不是不先編碼 – LP13

+0

你也可以在數據庫中設置一個觸發器 – jao

回答

3

要與你的第二個辦法:調整你的T4文件,包括一個接口上(如IChangeTrack):

/// <summary> 
/// Enhance save changes to handle system fields. 
/// </summary> 
/// <returns></returns> 
public override int SaveChanges() 
{ 
    HandleChanges(); 
    int changes = base.SaveChanges(); 
    return changes; 
} 

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken) 
{ 
    HandleChanges(); 
    int changes = await base.SaveChangesAsync(cancellationToken); 
    return changes; 
} 


private void HandleChanges() 
{ 
    ChangeTracker.DetectChanges(); 
    var entries = ChangeTracker.Entries<IChangeTrack>(); 
    if (entries != null) 
    { 
     foreach (DbEntityEntry<IChangeTrack> entry in entries) 
     { 
      switch (entry.State) 
      { 
       case EntityState.Added: 
        entry.Entity.CreatedDateTime = DateTime.UtcNow 
        break; 
       case EntityState.Modified: 
        entry.Entity.ModifiedDateTime = DateTime.UtcNow; 
        break; 
      } 
     } 
    } 
}