C# 实体框架(3.5)-拒绝更改
我有这个服务,它是单线程和单线程的,服务于大量的低容量客户端。它使用SQL Server中的实体框架和数据 如果客户机的任何一个保存数据的请求失败,则所有后续请求都将失败,因为每次它都试图保存原始失败的数据对象 当保存失败时,是否有方法撤消对EF数据的更改C# 实体框架(3.5)-拒绝更改,c#,entity-framework,C#,Entity Framework,我有这个服务,它是单线程和单线程的,服务于大量的低容量客户端。它使用SQL Server中的实体框架和数据 如果客户机的任何一个保存数据的请求失败,则所有后续请求都将失败,因为每次它都试图保存原始失败的数据对象 当保存失败时,是否有方法撤消对EF数据的更改 提前感谢实体模型/数据上下文/etc最好作为工作单元处理。如果需要取消它,只需放弃上下文并从一个新上下文开始。如果你成功了,无论如何都要放弃它!每个请求实际上应该使用单独的数据上下文,否则您可能会遇到一系列问题: 线程化(尽管听起来您通过使
提前感谢实体模型/数据上下文/etc最好作为工作单元处理。如果需要取消它,只需放弃上下文并从一个新上下文开始。如果你成功了,无论如何都要放弃它!每个请求实际上应该使用单独的数据上下文,否则您可能会遇到一系列问题:
- 线程化(尽管听起来您通过使其成为单线程来避免这种情况)
- 数据增长(有一个身份管理器;您触摸到的每一行都保持不变;事实上是多次)
- 一般隔离等
- 连接生存期管理(占用打开的连接)
- 等
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