Nhibernate(和一般的ORM):使用Objects或ObjectIds?

时间:2010-07-29 08:47:45

标签: asp.net-mvc nhibernate oop orm

这件事已经拉了我一段时间。考虑使用ORM(例如Nhiberate)作为数据访问层的(MVC类型)Web应用程序。

一方面 - OOP / Rich域模型手 - 我觉得我应该传递(引用)我正在讨论的真实对象。

另一方面 - 数据库/ Web应用程序手 - 我觉得传递对象的整数ID更容易,更有效率而不是反对自己。

考虑电子商务目录类型应用程序:

  • 用户已登录并导航至产品页面。
  • 他们发表评论。
  • 负责持久化此评论的控制器操作有3条信息:a)用户ID(来自auth cookie或任何地方),b)产品ID(可能来自查询字符串),以及c)评论文本。
  • 现在,这里的最佳做法是什么?当我们知道将要使用它们的所有内容时,是否真的值得对用户和产品对象进行膨胀(例如,通过从存储库中获取它们以及所需的所有数据库工作),以便ORM可以读取其ID并设置适当的外部存储注释的数据库表中的键?

人们对此有何看法?也许网络应用程序应该比其他应用程序更有效,因为它们的无状态特性?我想会有'它取决于'的答案,但也许有些人是关于这个问题的纯粹主义者。

这是一个可能适用于许多平台的一般性问题,但如果提供示例,我希望它们尽可能是ASP.NET MVC

谢谢。

1 个答案:

答案 0 :(得分:3)

由于这个原因,NHibernate具有加载操作(而不是执行get操作)。

session.Save(
  new Comment
      {
         Text = commentTextFromScreen,
         User = session.Load<User>(userID),
         Product = session.Load<Product>(productID)
      }
};

在上面的示例中,您正在告诉NHibernate:我知道这些已经存在于数据库中,因此请不要立即选择它们。 NHibernate将为它们返回代理对象,只要您不尝试访问对象的任何属性,就不会对数据库进行选择。

有关更多信息,请查看Ayende的博文:The difference between Get, Load, and query by id.