改变实体状态

时间:2009-04-08 15:33:50

标签: entity-framework

我目前有一个包含一堆已删除项目的实体模型,状态已删除。有没有办法“取消删除”他们?我知道我想取消删除哪些项目,但我不知道如何取消删除这些项目。理想情况下,我想让它恢复到未改变的状态。

3 个答案:

答案 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]