【问题标题】:Adding a relationship with an entity which is in the Deleted state is not allowed不允许添加与处于已删除状态的实体的关系
【发布时间】:2011-05-26 22:55:50
【问题描述】:

我正在尝试以以下方式删除对一对多关系中实体的引用,但是当我尝试将对象“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

更新:

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

    <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

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4.1 dbcontext


    【解决方案1】:

    当您将 o 附加到 _db.Organizations.Attach(o) 时,它会遍历其所有子级并发现其中一些已被删除。当它尝试附加它们时,您会收到所显示的错误。这很有意义。

    退后一步,弄清楚你想做什么。删除某些内容的最简单方法是获取它然后删除它。比如:

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

    如果需要,您可以仅使用其键模拟 MyEntity 对象,然后删除该对象,它也可以正常工作并为您节省选择查询。

    【讨论】:

    • 我认为这就是“_db.OrganizationMetrics.Remove(om)”会为我做的事情,但是那行代码会导致同样的错误。我正在尝试做的是遍历 ViewModel 中返​​回的 OrganizationMetric 实体并删除用户删除的任何实体(此时它们不会从模型中删除,只是标记为删除,因此我可以删除它们控制器)
    • 我最终做的是多步骤:1)我没有将子实体映射回父实体模型 2)我遍历 ViewModel 中的子实体,通过一,并根据需要从上下文中添加或删除它们 3)最后附加父实体,没有与之关联的“子实体”。我已经用我的功能代码更新了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多