1

ASP.Net MVC4 で nhibernate を使用してオブジェクトを更新する際に問題があります。このシナリオで更新を行っています。

the application loads an object in the first session

the object is passed up to the UI tier

some modifications are made to the object

the object is passed back down to the business logic tier

the application persists these modifications by calling SaveOrUpdate()

これはすべて、1 つのセッションでのみ発生します。クラス名 NHibernateSessionPerRequest が静的であり、そのコンストラクターは静的 (シングルトン) です。

 [HttpPost]
        public ActionResult Edit(Menu menu)
        {
            if (ModelState.IsValid)
            {
                repository.SaveOrUpdate(menu);
                TempData["message"] = string.Format("{0} has been saved", menu.Name);
                return RedirectToAction("Index");
            }
            else
            {
                // there is something wrong with the data values 
                return View(menu);
            }
        }

しかし、メニュー ID はゼロです。元の ID はありません (id は GUID のタイプです)。および SaveOrUpdate() は常に新しいオブジェクトとして扱い、更新せずに保存します。

ここに画像の説明を入力

Edit.cshtml は次のとおりです。

    @model MyApp.Domain.Entities.MenuComponent

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_AdminLayout.cshtml";
}

<h2>Edit @Model.Name
</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>MenuComponent</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Description)
            @Html.ValidationMessageFor(model => model.Description)
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

どうすればオブジェクトを更新できますか?

4

2 に答える 2

1

あなたのコメントから、私は2つの問題を見ます:

  • マークアップから削除したようです@Html.HiddenFor(model => model.ID)。元に戻す必要があります。そうしないと、ID がページに保存されず、Controller に戻されません。
  • あなたのIDコードは、セッターpublic virtual Guid ID { get; private set; }の修飾子を削除する必要があります。private投稿されたデータを受信するときにModelBinderがプロパティを設定できないようにしていると思います
于 2013-10-21T13:59:51.633 に答える
0

あなたが投稿したものから、エンティティをビューに返しているようで、ビューモデルが使用されているという概念はありません。

まず、通常、エンティティはプライベート セッターで定義されます。これにより、エンティティ自体を使用する場合に ID が Edit アクションに戻されなくなります。

第二に(私はこれについて確信が持てません)

ポストバックでオブジェクトを取得し、リクエストごとにセッションを使用しているため (非常に一般的であるため、仮定) nhibernate はそれを新しいエンティティとして扱う可能性があります。2番目の点については非常に疑わしいですが、これを再作成して回答を更新してみます

于 2013-10-19T00:40:42.443 に答える