Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架(3.5)-拒绝更改_C#_Entity Framework - Fatal编程技术网

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

C# 实体框架(3.5)-拒绝更改,c#,entity-framework,C#,Entity Framework,我有这个服务,它是单线程和单线程的,服务于大量的低容量客户端。它使用SQL Server中的实体框架和数据 如果客户机的任何一个保存数据的请求失败,则所有后续请求都将失败,因为每次它都试图保存原始失败的数据对象 当保存失败时,是否有方法撤消对EF数据的更改 提前感谢实体模型/数据上下文/etc最好作为工作单元处理。如果需要取消它,只需放弃上下文并从一个新上下文开始。如果你成功了,无论如何都要放弃它!每个请求实际上应该使用单独的数据上下文,否则您可能会遇到一系列问题: 线程化(尽管听起来您通过使

我有这个服务,它是单线程和单线程的,服务于大量的低容量客户端。它使用SQL Server中的实体框架和数据

如果客户机的任何一个保存数据的请求失败,则所有后续请求都将失败,因为每次它都试图保存原始失败的数据对象

当保存失败时,是否有方法撤消对EF数据的更改


提前感谢

实体模型/数据上下文/etc最好作为工作单元处理。如果需要取消它,只需放弃上下文并从一个新上下文开始。如果你成功了,无论如何都要放弃它!每个请求实际上应该使用单独的数据上下文,否则您可能会遇到一系列问题:

  • 线程化(尽管听起来您通过使其成为单线程来避免这种情况)
  • 数据增长(有一个身份管理器;您触摸到的每一行都保持不变;事实上是多次)
  • 一般隔离等
  • 连接生存期管理(占用打开的连接)

问题的答案是“您不能放弃对上下文的更改”,而必须放弃Marc解释的ObjectContext。

您可以通过调用

context.Refresh(RefreshMode.StoreWins, entity)

因此,我认为没有必要进行更改。

注意:您可以升级到EF 4.1或4.2,这使此项工作变得非常简单:

context.Entry(myEntity).State = EntityState.Unchanged;
详情请参阅

ObjectContext
生成的类创建一个分部类,并在其中包含以下方法(VB,抱歉-应该很容易转录为C#):


小心!在即将发布的新版本中,此功能变得非常简单。

是的,我意识到这太晚了。。但问题是,如果您处理对象上下文并尝试连接数据库,则性能太差。所以我们决定让对象上下文保持活动状态。试图找到一种在发生故障时回滚更改的方法。@Bhuvan-“性能不好”的说法通常意味着您过度查询数据。我做了很多工作,其中数据上下文的作用域非常紧密,性能非常好。谢谢Sven。。但问题是,我们必须跟踪哪些实体发生了变化。我有一个实体链,如果保存失败,需要提交或拒绝这些实体。我认为微软必须提供更好的处理方法。
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