2010-08-18 69 views
11

我有這種服務,它是單身人士和單線程,並服務一堆低量客戶端。它使用SQL Server中的實體框架和數據。實體框架(3.5) - 拒絕更改

如果客戶端對保存數據的任何請求失敗,所有後續請求都會因爲每次嘗試保存原始失敗數據對象而失敗。

當保存失敗時,是否有任何方法可以撤消對EF數據的更改?

由於提前

回答

4

問題的答案是「你不能放棄對上下文的更改」,而是必須像Marc解釋的那樣放棄ObjectContext。

11

實體的模型/數據上下文的/ etc是最好作爲工作的單位進行處理。如果您需要取消它,只需放棄上下文並從一個新的開始。如果你成功了,就拋棄它!每個請求確實應該使用單獨的數據環境中,否則,你可以得到一系列的問題:

  • 線程(雖然聽起來你已經通過使單線程避免這一點)
  • 數據增長(有是身份管理器;每一個你接觸行保持左右;多次,其實)
  • 一般隔離等
  • 連接生命週期管理(佔用一個打開的連接)
+0

是的,我意識到,太遲了..但問題是,如果你處置對象上下文並嘗試連接數據庫,性能太差。所以我們決定保持對象的上下文。試圖找到一種方式,我們可以在出現故障時回滾更改。 – Bhuvan 2010-08-19 20:39:02

+0

@Bhuvan - 「表現糟糕」聲稱通常意味着您正在過度查詢數據。我已經完成了大量的工作,其中數據上下文範圍非常緊密,而且它的性能非常好。 – 2010-08-19 21:05:16

3

你可以通過調用

context.Refresh(RefreshMode.StoreWins, entity) 

刷新實體,所以我認爲沒有必要RejectChanges。

+0

謝謝Sven ..但問題在於人們必須跟蹤哪些實體發生了變化。如果保存失敗,我有一些實體鏈需要被提交或拒絕。我認爲MS必須提供更好的處理方法。 – Bhuvan 2010-12-09 17:31:16

8

注意:您可以升級到EF 4.1或4.2,這使得這工作很容易的魅力:

context.Entry(myEntity).State = EntityState.Unchanged; 

請參考this查看詳細。

創建一個部分類到您ObjectContext生成的類,幷包括其下面的方法(VB,對不起 - 應該很容易轉錄成C#):

Public ReadOnly Property DirtyObjects() As IEnumerable(Of ObjectStateEntry) 
    Get 
    Return ObjectStateManager.GetObjectStateEntries(
     EntityState.Added Or 
     EntityState.Deleted Or 
     EntityState.Modified) 
    End Get 
End Property 


Public Overloads Sub Refresh() 
    For Each entry In DirtyObjects 
    Select Case entry.State 

     Case EntityState.Modified 
     Dim original = entry.OriginalValues 
     For Each prop In entry.GetModifiedProperties() 
      Dim ordinal = original.GetOrdinal(prop) 
      entry.CurrentValues.SetValue(ordinal, original(ordinal)) 
      RaisePropertyChanged(entry.Entity, prop) 
     Next 
     entry.AcceptChanges() 
     Case EntityState.Deleted 
     'I think I would need to call the above again, cuz it might be 
     'changed values on a Deleted-state entry too. 
     entry.ChangeState(EntityState.Unchanged) 
     Case EntityState.Added 
     entry.ChangeState(EntityState.Detached) 
     Case Else 
     'do nothing 
     Debug.Fail("It's not supposed to stop here.") 
    End Select 
    Next 
End Sub 

注意!在即將推出的新版本中,該功能變得更加簡單。

+1

。謝謝..好的解決方案... – Bhuvan 2011-01-03 15:25:26