我有一个服务,它是单例和单线程的,为一堆低负载客户提供服务。它使用Entity Framework和SQL Server中的数据。
如果任何一个客户端的保存数据请求失败,所有后续请求都会失败,因为每次都会尝试保存原始失败的数据对象。
是否有办法在保存失败时撤消对EF数据的更改?
提前感谢。
我有一个服务,它是单例和单线程的,为一堆低负载客户提供服务。它使用Entity Framework和SQL Server中的数据。
如果任何一个客户端的保存数据请求失败,所有后续请求都会失败,因为每次都会尝试保存原始失败的数据对象。
是否有办法在保存失败时撤消对EF数据的更改?
提前感谢。
实体模型、数据上下文等应该作为工作单元来处理。如果需要取消操作,只需丢弃上下文并开始新的操作。如果成功了,也要丢弃它!每个请求都应该使用单独的数据上下文,否则会出现一系列问题:
context.Entry(myEntity).State = EntityState.Unchanged;
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
注意!在新版本中,这个功能变得更加容易。
context.Refresh(RefreshMode.StoreWins, entity)
所以我认为没有必要使用RejectChanges。