2012-06-25 108 views
0

使用實體框架(4.3.1.0)處理項目。我試圖弄清楚如何讓我的代碼作爲一個事務工作,但對我來說,好像我的模型在事務失敗後不會更新。實體框架 - 模型在事務失敗後不會更新

讓我告訴你:

using (TransactionScope trans = new TransactionScope()) 
{ 
    _database.Units.Add(new Unit{ ... }); 
    var a = false; 
    if (a) 
    { 
     trans.Complete(); 
     Refresh(); 
    } 
} 

Refresh(); 

我的經驗是,TransactionScope的完成之後,它不回滾到之前的狀態。當我運行刷新方法時,我循環遍歷單元中的所有項目,並將值插入到一個ObservableCollection中,並將其顯示在WPF窗口中的屏幕上。

這種機制適用於我成功執行事務的時候,但是當我運行上面的代碼時,網格用新添加的單元進行更新,但是在事務之後運行Refresh之後它不會消失。

我有我做得fundamentaly錯在這裏:)

回答

2

實體框架不支持事務的內存跟蹤實體的感覺 - 它的「ObjectStateManager」你在看ObjectContext的是不是一個事務資源。 TransactionScope只適用於在其中完成的數據庫操作(查詢,更新),而不是內存操作,比如操作對象圖(這就是你所做的)。

+0

好的。這解釋了很多。我能否以某種方式告訴EF我需要爲全部或某些特殊表執行與數據庫的同步?我的意思是,如果我可以刷新_database.Units表,這將是完美的。 – AndersLindas

+0

不是。在您的代碼示例中,在回滾的情況下,您可以使用[OverwriteChanges](http://msdn.microsoft.com/zh-cn/library/system.data)分離新添加的實體並重新查詢所有單元的數據庫.objects.mergeoption.aspx)選項。 – cynic

+0

謝謝。我想我現在可以解決這個問題。另外,我使用Code First和DbContext代替ObjectContext。但是找到了有助於訪問ObjectContext的[鏈接](http://thedatafarm.com/blog/data-access/accessing-objectcontext-features-from-ef-4-1-dbcontext/)。 – AndersLindas