2015-07-21 133 views
3

我們正在擴展上下文對象以與另一個系統具有同步功能。我們目前正在使用savechanges進行此操作。但是,我們意識到有一種情況是,在使用begintransaction進行事務處理的情況下,會使用多個調用來保存更改。我們不希望在完成整個過程之前同步數據。我們認爲要在處理上下文時做到這一點。EF6事務回滾

我們有的一個問題是知道交易是否成功。如果成功了,那麼很好的同步。如果它回滾了,那麼我們當然不想同步。在處理上下文時,我們如何知道事務的狀態?

回答

1

讓你的模型需要同步來實現一個接口,例如iSyncable,它承諾一旦模型成功保存,你就會同步。如果您通過導航屬性具有相關表格,請保存所有內容並將其放入導航屬性中,然後再進行同步,以使您的同步功能具有所需的所有對象。

順便說一句,如果你需要做任何數據轉換,這將是你做的地方。

0

不要在dispose方法中執行此操作。處置是清理。使用以下模式:

using (var tran = new TransactionScope()) 
using (var db = new MyContext()) 
{ 
db.Connection.Open(); 
DoWork(db); 
tran.Complete(); 
} 

這就是你需要做的。

+0

我們沒有在使用交易時處理它。我們在繼承的上下文對象中。 – vbjay

+1

這正是解構器的作用:捆綁鬆散的末端,如關閉連接,只要對象存在,必須強制打開,完成事情並執行直到完成對象才能完成的任務(在這種情況下,上下文)。鑑於他需要進行多次保存然後進行最終同步,似乎他希望它是一個自動過程,消費者不必調用它,或者對最終透明,並且不能指望保存的頻率。另一種方法是擴展模型,使其在處置或範圍上「無論」。 – MetalPhoenix

+0

然後他應該包裝上下文。通過繼承來做這件事並不是繼承。這打破了可替代性。處置不應該做一些可以拋出的東西。這是因爲如果可能出現的使用/ finally塊被一個異常退出,那麼新的異常將取代舊的異常。一旦通過繼承進行這種人爲要求被放棄,解決方案就非常簡單。 – usr

1

您需要在事務管理器中登記您的操作以接收與事務相關的通知。

MSDN IEnlistmentTransaction

+0

謝謝你。這正是我需要使用它的一部分。我希望我可以將兩者都標記爲答案。 – vbjay