2012-12-03 62 views
0

我知道你可以重寫SaveChanges()方法在DbContext對象更新審計屬性值。但是,如果我想更新審計列而不實際將它們映射到實體,會發生什麼情況?表審計中的DbContext

有沒有辦法告訴實體框架,包括在「列到更新」列表額外未映射的列值?

謝謝!

+0

爲什麼你不想來映射列? –

+0

我的域模型需要與審計無關。這些數據僅與DBA相關。 –

回答

0

嗯...審計無關的......所以,你不知道,如果字段有與開始?還是你不在乎這些字段是否已設置?

如果以後你能不能添加列,但讓他們沒有要求?我個人通過繼承增加CreatedDate,CreatedBy,ModifiedDate,ModifiedBy到我的大部分實體。 I.E.你可以有一個AuditableEnity類,像這樣:

public class AuditableEnity 
{ 
    public int? CreatedById { get; set; } 

    [Display(Name = "Created Date")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy H:mm}")] 
    public DateTime? CreatedDate { get; set; } 


    public int? ModifiedById { get; set; } 

    [Display(Name = "Modified Date")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy H:mm}")] 
    public DateTime? ModifiedDate { get; set; } 
} 

然後你不必亂用樣板性質的所有車型。然後你只需添加一點。

那麼你的SaveChanges()可以是這個樣子:

public override int SaveChanges() 
    { 
     //Only get changes from the auditable entities 
     var changeSet = ChangeTracker.Entries<AuditableEnity>(); 

     ... 

     if (changeSet != null) 
     { 
      foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged)) 
      { 
       if (entry.State == EntityState.Added) 
       { 
        if (entry.Entity.OverrideAuditing == false) 
        { 
         entry.Entity.CreatedById = userId; 
         entry.Entity.CreatedDate = DateTime.UtcNow; 
        } 
       } 

       entry.Entity.ModifiedById = userId; 
       entry.Entity.ModifiedDate = DateTime.UtcNow; 
      } 
     }    

     return base.SaveChanges(); 
    }