2011-05-17 140 views
0

我有一個相當大的保存例程,它使用實體框架更新數百個項目,然後一次保存整個項目。在單個實體類型上擴展實體框架保存

using (var dc = new EntityLayer.Entities()) 
{ 
    dc.Entity1.Prop1 = 1; 
    dc.Entity1.Prop2 = 2; 
    dc.Entity2.Prop1 = 1; 
    dc.Entity2.Prop2 = 2; // Audit item 
    dc.Entity2.Prop3 = 3; // Audit item 
    dc.Entity3.Prop1 = 1; 
    ... 
    dc.SaveChanges(); 
} 

我很想能夠做的就是以某種方式要麼延長保存爲一個單獨的實體或拿起這一變化,並揭開序幕的另一種方法。

這樣做的主要目的是掛鉤我們的審計系統,審計系統只審計一些關鍵項目(例如上面簡化版本中只有Entity2.Prop2和Entity2.Prop3),但也可能啓動一些其他項目例程,創建任務等,但關鍵是 - 可以做到嗎?

基本上我的目標,以除去多餘的審計行,我們必須放在特定類型如下:

using (var dc = new EntityLayer.Entities()) 
{ 
    dc.Entity1.Prop1 = 1; 
    dc.Entity1.Prop2 = 2; 
    dc.Entity2.Prop1 = 1; 
    dc.Entity2.Prop2 = 2; 
    dc.Audit.CreateObject() { Type = "Entity2", Change = "Prop2", From = oldVal, To = 2} 
    dc.Entity2.Prop3 = 3; 
    dc.Audit.CreateObject() { Type = "Entity2", Change = "Prop3", From = oldVal, To = 3} 
    ... 
    dc.SaveChanges(); 
} 

回答

2

的唯一方法是重寫SaveChanges,發現已更改的實體,並致電例程他們。

public override int SaveChanges() 
{ 
    var entities = ChangeTracker.Entries<Entity1>() 
           .Where(e => e.State == EntityState.Modified) 
           .Select(e => e.Entity); 

    foreach(var entity in entities) 
    { 
     // call your rutine. 
    } 

    return base.SaveChanges(); 
} 
+0

乾杯,這是我將採取的這個路線,我使用EF-1.4,但我沒有得到ChangeTracker的句柄。 – 2011-05-17 12:52:00

+0

ChangeTracker是DbContext中的屬性。 – 2011-05-17 12:59:45