2017-03-17 88 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(); 
}