不允许添加与处于已删除状态的实体的关系

问题描述:

我试图通过以下方式在一对多关系中删除对实体的引用,但在尝试以下方式时收到错误将对象'o'附加到我的DbContext。错误是:不允许添加与处于已删除状态的实体的关系

“不允许添加与处于已删除状态的实体的关系。”

我自己也尝试在地方设置EntityState以下:

_db.OrganizationMetrics.Remove(om) 

的是换掉这个正确的方式?

<HttpPost()> 
Function Edit(ByVal ovm As OrganizationViewModel) 

    Dim o As Organization 


    o = AutoMapper.Mapper.Map(Of OrganizationViewModel, Organization)(ovm) 

    For Each om In o.OrganizationMetrics 
     _db.OrganizationMetrics.Attach(om) 

     If om.Value = "removeMe" Then 
      _db.Entry(om).State = EntityState.Deleted 
     ElseIf om.Id = 0 Then 
      _db.Entry(om).State = EntityState.Added 
     Else 
      _db.Entry(om).State = EntityState.Modified 
     End If 
    Next 

    _db.Organizations.Attach(o) 'Error is thrown here 

    If (ModelState.IsValid) Then 

     _db.Entry(o).State = EntityState.Modified 
     _db.SaveChanges() 

     Return RedirectToAction("Index") 
    Else 

     Return View(ovm) 
    End If 

End Function 

UPDATE:

这是我现在运行的代码。关键是要而不是将子实体从视图模型映射回父实体模型,以便我可以单独处理它们。

<HttpPost()> 
    Function Edit(ByVal ovm As OrganizationViewModel) 

     Dim o As Organization 

     o = AutoMapper.Mapper.Map(Of OrganizationViewModel, Organization)(ovm) //The Automapper code ignores the OrganizationMetrics members 
     _db.Organizations.Attach(o) 

     For Each om In ovm.OrganizationMetrics 
      _db.OrganizationMetrics.Attach(om) 

      If om.Value = "removeMe" Then 
       _db.Entry(om).State = EntityState.Deleted 
      ElseIf om.Id = 0 Then 
       _db.Entry(om).State = EntityState.Added 
      Else 
       _db.Entry(om).State = EntityState.Modified 
      End If 
     Next 


     If (ModelState.IsValid) Then 

      _db.Entry(o).State = EntityState.Modified 
      _db.SaveChanges() 

      Return RedirectToAction("Index") 
     Else 

      Return View(ovm) 
     End If 

    End Function 

当您将o与_db.Organizations.Attach(o)相加时,它会遍历其所有子项并发现其中一些子项已被删除。当它尝试附加它们时,会出现您显示的错误。它非常有意义。

退一步,找出你想要做什么。删除内容的最简单方法是获取并删除它。喜欢的东西:

context.DeleteObject(context.MyEntity.Single(r => r.Id == myId)); 

如果你愿意,你可以只用其关键嘲笑MyEntity对象,然后删除该对象时,它也能发挥作用,并节省您选择查询。

+0

我认为这就是“_db.OrganizationMetrics.Remove(om)”会为我做的,但该行代码会导致相同的错误。我想要做的是循环ViewModel中返回的OrganizationMetric实体,并删除用户删除的任何内容(它们不会从该模型中删除,只是标记为删除,因此我可以将它们删除控制器) – 2011-05-25 20:43:43

+1

我最终做的是多步骤:1)我没有将子实体映射回父实体模型2)我遍历ViewModel中的子实体,逐个添加它们,并添加或者根据需要从上下文中删除它们3)最后附加父实体,没有与其关联的“子”。我用我的功能代码更新了这个问题。 – 2011-05-26 14:53:57