我很困惑为什么这种情况开始发生,因为我已经解决了这个问题。当这个问题第一次出现时,我没有通过表单的POST操作传递@Html.HiddenFor(model => model.OrganizationID)
。我把它放进去后 - 效果很好。
现在,它不再起作用了。当我尝试删除某些内容时,将抛出DbUpdateConcurrencyException。我的编辑视图工作得很好。
我跟着this tutorial创建了模型第一种方法。
这些是我的控制器中的删除操作,OrganizationController:
public ActionResult Delete(int id)
{
using (var db = new VAGTCEntities())
{
return View(db.Organizations.Find(id));
}
}
//
// POST: /Organization/Delete/5
[HttpPost]
public ActionResult Delete(int id, Organization organization)
{
try
{
// TODO: Add delete logic here
using (var db = new VAGTCEntities())
{
db.Entry(organization).State = System.Data.EntityState.Deleted;
db.SaveChanges();
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
这是我的删除视图:
@model VAGTC.Models.Organization
@{
ViewBag.Title = "Delete";
}
<h2>Delete</h2>
<h3>Are you sure you want to delete this?</h3>
<fieldset>
<legend>Organization</legend>
<div class="display-label">
@Html.DisplayNameFor(model => model.Name)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.Name)
</div>
</fieldset>
@using (Html.BeginForm()) {
@Html.HiddenFor(model => model.OrganizationID)
<p>
<input type="submit" value="Delete" /> |
@Html.ActionLink("Back to List", "Index")
</p>
}
我调试它以查看是否正在传递id并确实将其传递给POST操作。我不确定从这里去哪里。我搜索的内容只会添加HiddenFor
语句。
答案 0 :(得分:0)
此异常表示由于某种原因,查询不会影响任何行(即行未被删除)。请尝试使用以下方法,而不是设置条目的状态:
db.Remove(organization);
db.SaveChanges();
编辑以回应评论
当您回发组织对象时,它将由视图的表单元素中包含的字段填充。在你的情况下,只有OrganisationId。您更改发布到控制器的实体对象的状态并保存它。如果您在任何EF实体上设置了并发模式属性(例如,在.edmx中),如果您为该字段传递的值与数据库值不一致,则EF将抛出并发异常。这可能就是为什么它需要Name字段的值。
更好的方法(如果您不关心删除期间的并发性)将删除方法签名中的对象,并重命名Id参数以接收OrganisationId。然后直接从数据库中读取对象,然后再设置其状态并保存它。