2017-03-17 100 views
0

设置:使用azure sql db,EF codefirst的asp.net mvc web应用程序。 在单个记录中将更改(由用户)提交给数据库表(A)中几个字段(来自viewModel)的值时,我的代码必须在另一个表(B)中进行更改。检测SubmitChanges()前的更改()

表B中的更改只有在表A中的某个字段也发生更改时才会发生。

有没有办法在实际更改之前检测某个字段的值是否已更改?

回答

1

在你DbContext子类,覆盖SaveChanges专门为A实体其具体属性看修改:

public override int SaveChanges() 
{ 
    var aEntries = this.ChangeTracker.Entries<A>() 
         .Where(e => e.Property(a => a.SomeProperty).IsModified); 
    foreach (var entry in aEntries) 
    { 
     // apply changes to B 
    } 
    return base.SaveChanges(); 
} 

旁注:

从单个责任和语义的观点,这不是我处理这种情况的首选方式。 SaveChanges的任务就是保存更改。人们不会指望它做任何事情。很容易忘记代码即使存在,它也不是其他人在维护或修复bug期间寻找代码的明显之处。

当添加的代码可能导致副作用时,情况会变得更糟。我会非常小心地修改SaveChanges中的任何上下文状态 - 而这正是我认为“对B应用更改”所要做的。我宁愿在重要的地方做这些修改:在修改A的代码中。

1

您可以覆盖你的DbContext类的SaveChanges,并检查实体从ChangeTracker改变:

public override int SaveChanges() 
{ 
    var changeSet = ChangeTracker.Entries<MyList>(); 

    if (changeSet != null) 
    { 
     // Add checks 
    } 
    return base.SaveChanges(); 
}