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();

コメントに応じて編集されました

組織オブジェクトをポストバックすると、ビューのフォーム要素に含まれるフィールドが入力されます。あなたの場合、それは OrganizationId だけです。コントローラにポストされたエンティティ オブジェクトの状態を変更して保存します。任意の EF エンティティ (.edmx など) で Concurrency Mode プロパティを設定した場合、そのフィールドに渡す値がデータベースの値と一致しない場合、EF は同時実行例外をスローします。それが、名前フィールドの値が必要な理由かもしれません。

より良いアプローチ (削除中の同時実行を気にしない場合) は、メソッド シグネチャでオブジェクトを削除し、Id 引数の名前を変更して OrganizationId を受け取ることです。次に、オブジェクトの状態を設定して保存する前に、データベースからオブジェクトを直接読み取ります。

于 2012-11-11T20:22:32.057 に答える