我有這種服務,它是單身人士和單線程,並服務一堆低量客戶端。它使用SQL Server中的實體框架和數據。實體框架(3.5) - 拒絕更改
如果客戶端對保存數據的任何請求失敗,所有後續請求都會因爲每次嘗試保存原始失敗數據對象而失敗。
當保存失敗時,是否有任何方法可以撤消對EF數據的更改?
由於提前
我有這種服務,它是單身人士和單線程,並服務一堆低量客戶端。它使用SQL Server中的實體框架和數據。實體框架(3.5) - 拒絕更改
如果客戶端對保存數據的任何請求失敗,所有後續請求都會因爲每次嘗試保存原始失敗數據對象而失敗。
當保存失敗時,是否有任何方法可以撤消對EF數據的更改?
由於提前
問題的答案是「你不能放棄對上下文的更改」,而是必須像Marc解釋的那樣放棄ObjectContext。
實體的模型/數據上下文的/ etc是最好作爲工作的單位進行處理。如果您需要取消它,只需放棄上下文並從一個新的開始。如果你成功了,就拋棄它!每個請求確實應該使用單獨的數據環境中,否則,你可以得到一系列的問題:
你可以通過調用
context.Refresh(RefreshMode.StoreWins, entity)
刷新實體,所以我認爲沒有必要RejectChanges。
謝謝Sven ..但問題在於人們必須跟蹤哪些實體發生了變化。如果保存失敗,我有一些實體鏈需要被提交或拒絕。我認爲MS必須提供更好的處理方法。 – Bhuvan 2010-12-09 17:31:16
注意:您可以升級到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
注意!在即將推出的新版本中,該功能變得更加簡單。
。謝謝..好的解決方案... – Bhuvan 2011-01-03 15:25:26
是的,我意識到,太遲了..但問題是,如果你處置對象上下文並嘗試連接數據庫,性能太差。所以我們決定保持對象的上下文。試圖找到一種方式,我們可以在出現故障時回滾更改。 – Bhuvan 2010-08-19 20:39:02
@Bhuvan - 「表現糟糕」聲稱通常意味着您正在過度查詢數據。我已經完成了大量的工作,其中數據上下文範圍非常緊密,而且它的性能非常好。 – 2010-08-19 21:05:16