实体框架(3.5)- 拒绝更改

11

我有一个服务,它是单例和单线程的,为一堆低负载客户提供服务。它使用Entity Framework和SQL Server中的数据。

如果任何一个客户端的保存数据请求失败,所有后续请求都会失败,因为每次都会尝试保存原始失败的数据对象。

是否有办法在保存失败时撤消对EF数据的更改?

提前感谢。

4个回答

11

实体模型、数据上下文等应该作为工作单元来处理。如果需要取消操作,只需丢弃上下文并开始新的操作。如果成功了,也要丢弃它!每个请求都应该使用单独的数据上下文,否则会出现一系列问题:

  • 线程问题(虽然你已经通过单线程避免了这个问题)
  • 数据增长问题(存在标识管理器;每行数据被访问后都会保留多次)
  • 隔离性等问题
  • 连接生命周期管理问题(占用开放连接)
  • 等等

是的,我也意识到这一点太晚了...但问题在于,如果您处置对象上下文并尝试连接数据库,则性能会非常差。因此,我们决定保持对象上下文的活动状态。我们正在尝试找到一种方法,在发生故障的情况下可以回滚更改。 - Bhuvan
@Bhuvan - “性能不佳”的说法通常意味着您正在过度查询数据。我已经做了很多工作,其中数据上下文非常紧密,而且完全具备高性能。 - Marc Gravell

8
注意:您可以升级到EF 4.1或4.2,这将使此任务变得非常容易。
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

注意!在新版本中,这个功能变得更加容易。


4
回答这个问题的方法是“你不能放弃对上下文的更改”,而是必须像Marc解释的那样放弃ObjectContext。

3
您可以通过调用以下方法来刷新实体:
context.Refresh(RefreshMode.StoreWins, entity)

所以我认为没有必要使用RejectChanges。


谢谢Sven.. 但是这个方法的问题在于必须跟踪哪些实体已更改。我有一系列需要在保存失败时提交或拒绝的实体链。我认为微软必须提供更好的处理方式。 - Bhuvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接