2011-05-17 125 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