0

我很困惑为什么会发生这种情况,因为我已经解决了这个问题。当这个问题第一次发生时,我没有@Html.HiddenFor(model => model.OrganizationID)通过表单的 POST 操作。在我把它放进去之后——它工作得很好。

现在,它不再工作了。当我尝试删除某些内容时,会引发 DbUpdateConcurrencyException。我的编辑视图工作得很好。

我按照本教程创建了模型优先方法。

这些是我的控制器 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声明即可。

4

1 回答 1

0

此异常表明由于某种原因,您的查询没有影响任何行(即未删除该行)。尝试使用以下方法,而不是设置条目的状态:

db.Remove(organization);
db.SaveChanges();

根据评论编辑

当您回发组织对象时,它将由视图的表单元素中包含的字段填充。在您的情况下,这只是 OrganisationId。您更改发布到控制器的实体对象的状态并保存它。如果您在任何 EF 实体上设置了并发模式属性(例如在 .edmx 中),如果您为该字段传递的值与数据库值不一致,EF 将引发并发异常。这可能是它需要 Name 字段值的原因。

更好的方法(如果您不关心删除期间的并发)是删除方法签名中的对象,并重命名 Id 参数以接收 OrganisationId。然后在设置其状态并保存之前直接从数据库中读取对象。

于 2012-11-11T20:22:32.057 回答