为什么我的 ASP.NET MVC3Edit
操作被赋予一个新对象而不是要编辑的对象?
当我检查对象的属性时,给定的 ID 值是unsaved-value
我在 NHibernate 映射文件中指定的。
为了解决这个问题,我可以从数据库中查询要更新的对象,并从传递给方法的对象中设置我想要的属性。但是,虽然这对于具有一两个属性的非常简单的对象来说是可以的,但当有很多属性并且似乎我正在与系统作斗争时,它很快就会成为一个问题(对我来说,这表明我没有这样做事情按照他们应该做的方式)。
我的映射:
<id name="Id" column="Id" type="Guid"
unsaved-value="00000000-0000-0000-0000-000000000000">
我的编辑方法:
[NHibernateActionFilter]
[HttpPost]
public ActionResult Edit(Status status, Guid id)
{
try
{
if (ModelState.IsValid)
{
var originalStatus = Session.QueryOver<Status>()
.Where(s => s.Id == id)
.SingleOrDefault<Status>();
if (originalStatus == null)
throw new Exception(string.Format("No Status with Id: {0}.", id));
originalStatus.StatusName = status.StatusName;
Session.Update(originalStatus );
return RedirectToAction("Index");
}
}
catch (DataMisalignedException ex)
{
// TODO: Log4Net this
ModelState.AddModelError("", "Unable to save changes. Please try again.");
}
return View(status);
}
*这NHibernateActionFilter
摘自 Ayende 关于重构无摩擦和无气味代码的一系列帖子,并为控制器中的每个操作提供了一个 ISession。但是,我认为这不是问题的原因。
尝试编辑项目时出现我的问题,StaleObjectException
抛出 a:
行被另一个事务更新或删除(或未保存的值映射不正确):[TheWorkshop.Web.Models.Status#00000000-0000-0000-0000-000000000000]
新的 Guid 向我显示提到的状态是新的,而不是先前返回的对象,以便填充详细信息视图。因此,似乎一个新对象已被更新并传递到我的 EditActionResult
中,但这没有帮助。
正如我在上面展示的那样,我可以围绕它进行编码,但这更像是一种技巧而不是解决方案。我希望能够像这样离开我的 Edit 方法:
[NHibernateActionFilter]
[HttpPost]
public ActionResult Edit(Status status)
{
try
{
if (ModelState.IsValid)
{
Session.Update(status);
return RedirectToAction("Index");
}
}
catch (DataMisalignedException ex)
{
// TODO: Log4Net this
ModelState.AddModelError("", "Unable to save changes. Please try again.");
}
return View(status);
}
编辑
我已经查看了如何处理更新实体的答案。NHibernate + ASP.NET MVC但这几乎完成了我已经完成的工作,我不敢相信更新方法必须像我的尝试那样混乱。
我还查看了这个错误在 nhibernate 中的含义;它看起来与我的问题相同,但我无法得到任何适合我的答案,即问题仍然存在。