我在使用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 并且它的构造函数是静态的(singeleton)
[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>
如何更新对象?
答案 0 :(得分:1)
从你的评论中,我看到两个问题:
@Html.HiddenFor(model => model.ID)
。您应该将其放回去,否则您的ID将不会存储在页面中以便发回给您的控制器。ID
代码为public virtual Guid ID { get; private set; }
您应该删除设置者上的private
修饰符。我想这可以防止ModelBinder在收到发布的数据时设置属性答案 1 :(得分:0)
根据您发布的内容,您似乎将实体返回到视图,并且没有使用任何视图模型的概念。
首先 通常,实体是使用私有setter定义的,如果您使用实体本身,这将阻止id被发布回Edit操作。
其次(我不确定)
因为你在帖子中获得对象并且每个请求使用一个会话(假设因为它很常见),所以nhibernate可能会将它视为一个新实体。我对第二点非常怀疑,但会尝试重新创建并更新答案