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

所有这一切只发生在一个会话中。我有一个静态的类名 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

从您的评论中,我看到两个问题:

  • 看来您已从@Html.HiddenFor(model => model.ID)标记中删除。您应该将其放回原处,否则您的 ID 将不会存储在要发布回控制器的页面中。
  • 您的ID代码是public virtual Guid ID { get; private set; }您应该删除privatesetter 上的修饰符。我猜它会阻止 ModelBinder 在接收发布的数据时设置属性
于 2013-10-21T13:59:51.633 回答
0

从您发布的内容看来,您正在将实体返回到视图,并且没有使用任何视图模型的概念。

首先,通常实体是用私有设置器定义的,如果您使用实体本身,这将阻止 id 被发布回 Edit 操作。

其次(我不确定)

因为您要在回帖中获取对象并使用每个请求的会话(假设因为它很常见),所以 nhibernate 可能会将其视为一个新实体。我对第二点非常怀疑,但会尝试重新创建并更新答案

于 2013-10-19T00:40:42.443 回答