我目前有一个包含一堆已删除项目的实体模型,状态已删除。有没有办法“取消删除”他们?我知道我想取消删除哪些项目,但我不知道如何取消删除这些项目。理想情况下,我想让它恢复到未改变的状态。
答案 0 :(得分:8)
objectContext.DeleteObject(x),
您可以使用
模拟对象 x 的取消删除<强> objectContext.Detach(X); objectContext.Attach(x)的强>
答案 1 :(得分:2)
您是否可以选择不提交连接上下文? - 在不调用objectContext.SaveChanges()的情况下释放ObjectContext;当然,如果你有某些改变,你不会保存,它们也不会持续存在。
如果您致电objectContext.DeleteObject(x)
,则无法取消删除并仍保存更改。
ObjectStateEntry objectStateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(x);
// objectStateEntry.State is not setable
ObjectStateEntry确实具有OriginalValues属性,因此理论上可以精心地重新创建一个表示原始更改的集合,减去不需要的更改,退出objectContext,打开一个新的并重建那些更改减去不需要的更改。可能不值得麻烦,但目前还没有记录的方法可以取消标记删除的内容。
答案 2 :(得分:0)
您可以为Context,ObjectSet或EntityObject实现RejectChanges方法。 现在我编写这些方法的VB代码: 上下文中RejectChanges的扩展方法:
<Extension()>
Sub RejectChanges(ByVal Context As ObjectContext)
Dim Collectin As IEnumerable(Of Object) = From e In Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified Or System.Data.EntityState.Deleted) Select e.Entity
Context.Refresh(RefreshMode.StoreWins, Collectin)
Dim AddedCollection As IEnumerable(Of Object) = From e In Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added) Select e.Entity
For Each addedEntity As Object In AddedCollection
Context.Detach(addedEntity)
Next
End Sub
在ObjectSet中实现RejectChanges的扩展方法:
<Extension()>
Sub RejectChanges(Of T As MyEntity)(ByVal Lst As ObjectSet(Of T))
Dim collection As IEnumerable(Of T) = From o In Lst.AsEnumerable() Where o.EntityState = EntityState.Modified Or o.EntityState = EntityState.Deleted Select o
Lst.Context.Refresh(RefreshMode.StoreWins, collection)
Dim AddedCollection As IEnumerable(Of T) = (From e In Lst.Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added) Select e.Entity).ToList().OfType(Of T)()
For Each entity As T In AddedCollection
Lst.Context.Detach(entity)
Next
End Sub
最后为EntityObject实现RejectChanges:
<Extension()>
Sub RejectChanges(ByVal entity As EntityObject, ByVal Context As ObjectContext)
If entity.EntityState = EntityState.Modified OrElse entity.EntityState = EntityState.Deleted Then
Context.Refresh(RefreshMode.StoreWins, entity)
ElseIf entity.EntityState = EntityState.Added Then
Context.Detach(entity)
End If
End Sub
再见。 [Iman Shabanzade]