2009-04-08 88 views
4

我目前有一堆实体模型,有一堆已删除的项目,状态将被删除。有没有办法“删除”他们?我知道我想要取消删除哪些项目,但我不知道如何取消删除项目。理想情况下,我想回到未改变的状态。更改实体状态

回答

2

你有没有选择只提交连接上下文? - 在不调用objectContext.SaveChanges()的情况下处置ObjectContext。当然,如果你有一些你不能保存的变化,他们也不会持续。

如果您拨打objectContext.DeleteObject(x),则无法取消删除并仍保存更改。

ObjectStateEntry objectStateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(x); 

// objectStateEntry.State is not setable 

ObjectStateEntry确实有OriginalValues属性,因此,你可以在理论上,精心重建表示原始的变化,减去不想要的集合,退出ObjectContext的,打开一个新的和重建这些变化减去不必要的那里的人。可能不值得麻烦,但目前没有记载的方式来取消删除某些东西的标记。

+0

这太糟糕了。我有一种感觉,没有办法。不幸的是,我们不能仅仅清除背景,所以这不是一个真正的选择。现在我已经实现了一个在删除之前被修改的对象列表。这实际上是一个非常大的麻烦,而且很糟糕的是某些东西不能被标记为不变。 – JohnathanKong 2009-05-06 18:50:31

+0

实体框架设计博客http://blogs.msdn.com/efdesign/说: “...自动跟踪实体架构将与VisualStudio 2010和.NET Framework 4.0一起发行。” “... ... 如果需要,每个自我跟踪实体上都有传播方法来更改此状态(Delete()和SetUnchanged())。” 所以看起来这个功能在EF2中可用 – Tion 2009-05-11 14:33:45

8

调用后

objectContext.DeleteObject(x)的

可以模拟对象的反删除X

objectContext.Detach(X); objectContext.Attach(x)

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 

扩展mehod为对象集实现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  

终于实现RejectChanges为EntityObject:

<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  

bye。 [伊曼Shabanzade]