設置:使用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();
}