【问题标题】:How would you handle this situation with nHibernate您将如何使用 nHibernate 处理这种情况
【发布时间】:2009-06-18 03:15:18
【问题描述】:

我的数据库中有 2 个表:

  • 类别
  • 博客条目

每个 BlogEntry 都有 1 个或多个 Categorys 与之关联。

如果我想通过其 ID 获取 BlogEntry,我还想获取其 Category 信息。

也许这个例子并没有准确地说明这会有意义的场景,但假设我只想加载 Category ID 和 Name,而不是类别数据库中的所有其他列。

nHibernate 会加载每个实体的所有列/属性吗?

【问题讨论】:

    标签: asp.net-mvc nhibernate oop


    【解决方案1】:

    我将通过将其映射为 BlogEntry 和 Category 之间的一对多关联来处理此问题,以便 BlogEntry 具有 Category 的集合。我会设置它,以便类别集合是延迟加载的。我不在乎我加载的列多于我将显示的列,因为我正在处理业务对象并通过主键或外键进行选择。 NHibernate 的工作就是担心这一点,尽管我会在开发过程中使用 SQL Profiler 或 NHProf 进行检查。

    NHibernate 将通过使用 BlogEntry 中的外键选择类别记录来加载集合。在几乎所有情况下,仅返回您将要显示的字段并不会提高性能。检索仅根据显示要求填充所需属性的业务对象不是一个好的面向对象实践。

    【讨论】:

      【解决方案2】:

      这取决于你如何映射它。显然位代码检测可以只允许检索部分表,但很少需要。

      也许可以解释为什么您只需要类别的 id...

      如果您定义休眠映射,而不是使用类别映射到类别对象的实体,只需将其作为整数。当我不关心能否使用原始查询获取附件时,这就是我处理映射的方式。

      【讨论】:

      • 为什么?就像我说的,为了避免加载我不需要显示的列。
      【解决方案3】:

      你会想研究投影。我们实际上是使用 AliasToBean 转换器让 NHibernate 将我们的投影直接转换为特定于屏幕的 DTO。

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多