2014-03-13 53 views
1

創建或使用的EntityFramework 4.的EntityFramework當調用SaveChanges

我搜索在這裏更新行過程,並覆蓋SaveChanges方法我想自動更新「CREATEDATE」和「UpdateDate」 4校驗字段存在,效果很好。

public partial class MyEntities: DbContext 
{ 
    public override int SaveChanges() 
    { 
     var context = ((IObjectContextAdapter)this).ObjectContext; 
     context.DetectChanges(); 
     var entries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified); 
     foreach (var entry in entries) 
     { 
      CurrentValueRecord entryValues = entry.CurrentValues; 
      if (entry.State == EntityState.Added) 
      { 
       if (entryValues.GetOrdinal("CreateDate") > 0) 
        entryValues.SetDateTime(entryValues.GetOrdinal("CreateDate"), DateTime.Now); 

       if (entryValues.GetOrdinal("UpdateDate") > 0) 
        entryValues.SetDateTime(entryValues.GetOrdinal("UpdateDate"), DateTime.Now); 

      } 

      if (entry.State == EntityState.Modified) 
      { 
       if (entryValues.GetOrdinal("UpdateDate") > 0) 
        entryValues.SetDateTime(entryValues.GetOrdinal("UpdateDate"), DateTime.Now); 

      } 
     } 

     return base.SaveChanges(); 
    } 
} 

但是不是每個表都有UpdateDate,有的甚至沒有CREATEDATE場

entryValues.GetOrdinal("UpdateDate") 

我不知道如何來檢查條目有這些領域,也不要找不到任何

的Try ...

方法。

+0

待辦事項你可以控制實體類,例如有些但現在都包含CreateDate和UpdateDate字段的類? –

+0

使用反射來檢查屬性是否存在。就像'entry.GetType()。GetProperty(「UpdateDate」)!= null' – Nilesh

+0

我無法控制。所以我需要的是當插入任何新行做數據庫,檢查實體是否有「CreateDate」,如果是的話,給它現在,如果沒有,然後忽略。 – Bubble

回答

1

我會考慮讓基類或爲具有CREATEDATE這些實體的接口或UpdateDate

public interface IAuditEntity 
{ 
    DateTime CreateDate {get;set;} 
    DateTime UpdateDate {get;set;} 
} 

public class SomeEntity : IAuditEntity 
{ 
    public DateTime CreateDate {get;set;} 
    public DateTime UpdateDate {get;set;} 
} 

然後在保存功能,您可以檢查您的條目是IAuditEntity

if (entry is IAuditEntity) 
{ 
    if(((IAuditEntity)entry).CreateDate ...) 
    { 
     //... 
    } 
} 
相關問題