在SubmitChanges()之前检测更改

时间:2017-03-17 12:28:35

标签: asp.net-mvc entity-framework azure-sql-database

设置:asp.net mvc web app与azure sql db,EF codefirst。 当在单个记录中将更改(由用户)提交到db表(A)中的多个字段(来自viewModel)中的值时,我的代码必须在另一个表(B)中进行更改。

表B中的更改只有在表A中的某个字段也发生变化时才能进行。

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

2 个答案:

答案 0 :(得分:1)

您可以在DbContext类中覆盖SaveChanges,并从ChangeTracker中检查要更改的实体:

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

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

答案 1 :(得分: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的任务是保存更改。人们不会指望它做任何其他事情。很容易忘记代码就在那里,而且在维护或修复错误的过程中,其他人也不是寻找代码的明显地方。

当添加的代码可能导致副作用时,情况会变得更糟。我会非常谨慎地改变SaveChanges中的任何上下文状态 - 而这正是我的想法&#34;将更改应用于B&#34;要去做。我更愿意在重要的地方进行这些修改:在A被修改的代码中。