Asp.net mvc 3 不允许添加与处于“已删除”状态的实体的关系
我试图以以下方式删除对一对多关系中实体的引用,但在尝试将对象“o”附加到DbContext时收到错误。错误是: “不允许添加与处于已删除状态的实体的关系。” 我还尝试了以下方法来代替EntityState的设置: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
_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)最后附加父实体,没有与之关联的“子实体”。我已经用我的功能代码更新了这个问题。