Asp.net mvc 3 不允许添加与处于“已删除”状态的实体的关系

Asp.net mvc 3 不允许添加与处于“已删除”状态的实体的关系,asp.net-mvc-3,entity-framework-4.1,dbcontext,Asp.net Mvc 3,Entity Framework 4.1,Dbcontext,我试图以以下方式删除对一对多关系中实体的引用,但在尝试将对象“o”附加到DbContext时收到错误。错误是: “不允许添加与处于已删除状态的实体的关系。” 我还尝试了以下方法来代替EntityState的设置: _db.OrganizationMetrics.Remove(om) 什么是删除此项的正确方法 <HttpPost()> Function Edit(ByVal ovm As OrganizationViewModel) Dim o As Organizati

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

功能编辑(ByVal ovm As OrganizationViewModel)
D.o.As组织
o=AutoMapper.Mapper.Map(组织的视图模型,组织)(ovm)
对于o.OrganizationMetrics中的每个om
_db.OrganizationMetrics.Attach(om)
如果om.Value=“removeMe”,则
_db.Entry(om.State=EntityState.Deleted
ElseIf om.Id=0,则
_db.Entry(om.State=EntityState.Added
其他的
_db.Entry(om.State=EntityState.Modified
如果结束
下一个
_这里抛出db.Organizations.Attach(o)错误
如果(ModelState.IsValid),则
_db.Entry(o.State=EntityState.Modified
_db.SaveChanges()
返回重定向操作(“索引”)
其他的
返回视图(ovm)
如果结束
端函数
更新:

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

    <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

功能编辑(ByVal ovm As OrganizationViewModel)
D.o.As组织
o=AutoMapper.Mapper.Map(属于OrganizationViewModel,Organization)(ovm)//AutoMapper代码忽略OrganizationMetrics成员
_db.Organizations.附件(o)
对于ovm.OrganizationMetrics中的每个om
_db.OrganizationMetrics.Attach(om)
如果om.Value=“removeMe”,则
_db.Entry(om.State=EntityState.Deleted
ElseIf om.Id=0,则
_db.Entry(om.State=EntityState.Added
其他的
_db.Entry(om.State=EntityState.Modified
如果结束
下一个
如果(ModelState.IsValid),则
_db.Entry(o.State=EntityState.Modified
_db.SaveChanges()
返回重定向操作(“索引”)
其他的
返回视图(ovm)
如果结束
端函数

当您使用
\u db.Organizations.attach(o)
附加o时,它会检查其所有子项,发现其中一些子项已被删除。当它试图附加它们时,您会得到显示的错误。这很有道理

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

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

如果您愿意,您可以只使用其键模拟
MyEntity
对象,然后删除该对象,它也可以工作,并为您保存一个select查询。

我认为“\u db.OrganizationMetrics.Remove(om)”对我来说就是这样做的,但这行代码会导致相同的错误。我试图做的是循环查看ViewModel中返回的OrganizationMetric实体,并删除用户删除的任何实体(此时它们不会从模型中删除,只是标记为删除,以便我可以在控制器中删除它们)我最后做的是多步骤:1)我没有将子实体映射回父实体模型2)我在ViewModel中迭代子实体,逐个附加它们,并根据需要从上下文中添加或删除它们3)最后附加父实体,没有与之关联的“子实体”。我已经用我的功能代码更新了这个问题。