我有这个Singleton和Single线程的服务,并为一堆小容量客户端提供服务。它在SQL Server中使用实体框架和数据。
如果客户端的任何一个保存数据请求失败,则每次尝试保存原始失败数据对象时,所有后续请求都将失败。
保存失败时,是否有任何方法可以撤消对EF数据的更改?
先谢谢
答案 0 :(得分:11)
实体模型/数据上下文/等最佳作为工作单元处理。如果您需要取消它,只需丢弃上下文并从新的上下文开始。如果你成功了,无论如何都要丢弃它!每个请求应该使用单独的数据上下文,否则您可能会遇到一系列问题:
答案 1 :(得分: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
抬起头来!在即将推出的新版本中,这个功能已经变得更加容易了。
答案 2 :(得分:4)
问题的答案是“你不能放弃对上下文的更改”而不是像Marc解释的那样丢弃ObjectContext。
答案 3 :(得分:3)
您可以通过调用
刷新实体context.Refresh(RefreshMode.StoreWins, entity)
所以我认为不需要RejectChanges。