【发布时间】:2011-08-07 12:50:44
【问题描述】:
使用 ASP.net MVC 我正在这样做:
[HttpPost]
[TransactionFilter]
public ActionResult Create(User user)
{
// Ommited some things for the sake of brevity
_userRepository.Add(user);
return RedirectToAction("Details", new { Id = user.Id });
}
这按我的预期工作。现在我正在尝试这样做:
[HttpPost]
[TransactionFilter]
public ActionResult Create(User user, ChildOfUser userChild)
{
// Ommited some things for the sake of brevity
var parent = _userRepository.GetById(user.Id);
parent.Children.Add(userChild);
return RedirectToAction("Details", new { Id = userChild.Id });
}
这会失败,因为 userChild.Id 为空。第一种情况有效,因为在 repo 中我调用了session.Save(user);,并且此调用将更改 user.Id 属性。
(User)parent.Children.Add(userChild); 调用不会更改 userChild.Id 属性。只有在调用transaction.Commit(); 之后,userChild.Id 才会有一个有意义的值。虽然我希望通过将 userChild 添加到集合中来设置 Id。
现在,NHibernate 应该处理这个吗?还是我的期望错了?如果有办法让 NHibernate 处理这个问题,那就太棒了。
编辑 在这种情况下,ID 始终是 GUID。我可以自己设置它们(它们是全局唯一的权利...),NHibernate 会像它自己生成 Id 一样使用它吗?
【问题讨论】:
-
重新编辑:是的,NHibernate 将使用它,并且客户端生成的 Id(例如 GUID 或 HiLo)对您的 ORM 性能友好,因此对您的应用程序也是如此。当您使用预生成的 id 时,将不再需要获取父 ID 的 db 往返;对您的表的争用也较少,生成后的 Id 往往会锁定表,每个 Id 请求者都需要等待 Id 生成,特别是如果表包含在事务中。
标签: c# nhibernate domain-driven-design