设置:使用azure sql db,EF codefirst的asp.net mvc web应用程序。 在单个记录中将更改(由用户)提交给数据库表(A)中几个字段(来自viewModel)的值时,我的代码必须在另一个表(B)中进行更改。检测SubmitChanges()前的更改()
表B中的更改只有在表A中的某个字段也发生更改时才会发生。
有没有办法在实际更改之前检测某个字段的值是否已更改?
设置:使用azure sql db,EF codefirst的asp.net mvc web应用程序。 在单个记录中将更改(由用户)提交给数据库表(A)中几个字段(来自viewModel)的值时,我的代码必须在另一个表(B)中进行更改。检测SubmitChanges()前的更改()
表B中的更改只有在表A中的某个字段也发生更改时才会发生。
有没有办法在实际更改之前检测某个字段的值是否已更改?
在你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
的代码中。
您可以覆盖你的DbContext类的SaveChanges,并检查实体从ChangeTracker改变:
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<MyList>();
if (changeSet != null)
{
// Add checks
}
return base.SaveChanges();
}