设置:asp.net mvc web app与azure sql db,EF codefirst。 当在单个记录中将更改(由用户)提交到db表(A)中的多个字段(来自viewModel)中的值时,我的代码必须在另一个表(B)中进行更改。
表B中的更改只有在表A中的某个字段也发生变化时才能进行。
有没有办法在实际进行更改之前检测某个字段的值是否已更改?
答案 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
被修改的代码中。