Добавление отношения с сущностью, находящейся в удаленном состоянии, не допускается. - PullRequest
3 голосов
/ 25 мая 2011

Я пытаюсь удалить ссылку на сущность в отношении «один ко многим» следующим образом, но получаю сообщение об ошибке, когда пытаюсь присоединить объект «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

1 Ответ

3 голосов
/ 25 мая 2011

Когда вы присоединяете o с помощью _db.Organizations.Attach(o), он просматривает все свои дочерние элементы и обнаруживает, что некоторые из них удалены.Когда он пытается присоединить их, вы получаете сообщение об ошибке.Это имеет смысл.

Отойдите назад и выясните, что именно вы хотите сделать.Самый простой способ удалить что-либо - это получить его, а затем удалить.Что-то вроде:

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

Если хотите, вы можете смоделировать объект MyEntity только его ключом, а затем удалить этот объект, он также будет работать и сохранит ваш запрос выбора.

...