【问题标题】:Map a property to the latest entry in NHibernate将属性映射到 NHibernate 中的最新条目
【发布时间】:2009-06-06 02:26:17
【问题描述】:

假设我的域如下所示:

  • 我有一个对象 Vehicle,它具有 OdometerReading 属性。
  • OdometerReading 具有里程和日期(读取时间)。

我需要在数据库中保留 Vehicle 的所有 OdometerReadings 的历史记录,但不希望整个里程表历史记录属于 Vehicle 对象。我想要的是 OdometerReading 属性映射到数据库中最新的 OdometerReading 条目。

我曾考虑将 OdometerReadings 的整个集合映射到 Vehicle,并使用一个名为 CurrentOdometerReading 的动态属性来对它们进行排序并返回最新的,但我不需要域中 Vehicle 下的整个集合,并且似乎我会从数据库中获取比我需要的更多的数据。

NHibernate 有可能吗?我将如何映射这样的东西?

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    根据您希望域模型的外观,有几种方法可以做到这一点。我的首选是使用自定义集合类型,例如 IOdometerReadingCollection,您可以向其中添加额外的方法。在这种情况下,它可能类似于:

    public interface IOdometerReadingCollection : IList<OdometerReading>
    {
        OdometerReading Latest { get; }
    }
    

    这样你就可以做到:

    OdometerReading reading = vehicle.OdometerReadings.Latest;
    

    我更喜欢:

    OdometerReading reading = vehicle.LatestOdometerReading;
    

    有很多关于自定义集合的文档,您可以通过简单的 google 搜索找到。

    如果这种方法不适合您,还有其他选择。您可以使用带有公式的属性(我不确定这是否适用于复杂类型?),或者常规的 NHibernate 关联,您可以在其中拥有车辆映射上最新的 OdometerReading 的键。正如您还提到的,您可以只加载所有 OdometerReadings,这取决于您的用例实际上可能没问题。

    我希望这会有所帮助,或者至少为您指明正确的方向。

    【讨论】:

    • 谢谢,乔尼。这仍然会给我留下一组 OdometerReadings。我希望车辆上有一个单一的里程表读数。有没有办法只有一个里程表读数,并且是最新的?
    • 通过这种方式,您可以访问所有里程表读数(如果您需要),也可以获得最新的读数。如果您只想要最新的,最好使用 Epitka 建议的内容(where 子句)。
    • 无论您选择哪种解决方案,都可以通过 vehicle.LatestOdometerReading 或 vehicle.OdometerReadings.Latest 订购一组车辆(使用标准 api)吗?
    • 这取决于您如何表示里程表读数。例如,如果它们只是整数,您可以将它们存储为车辆表的一部分,然后您可以对其进行排序。如果你想带回整个集合,并让它由 db 预先排序,那就有点棘手了。根据车辆的数量,您最好在内存中执行此操作。
    【解决方案2】:

    您可以在集合映射中添加一个“where”子句。检查参考文档。

    【讨论】:

    • 这仍然会给我一个集合,只有一个结果,不是吗?我根本不希望 OdometerReadings 成为一个集合。
    • 没有人强迫您将其公开为集合,您可以将其作为私有字段,然后映射属性 private decimal _odometerReadings;公共小数 LastOdometerReading { get { return _odometerReadings.FirstOrDefault(); } }
    【解决方案3】:

    我会将 OdometerReading 属性映射为一个组件,然后使用命名查询来确保它填充了数据库的最新读数。 (在此示例中,您将有一个名为“vehicle”的 sql 查询,该查询执行 SQL 以加载 Vehicle 列以及最新的里程表读数)

    <class name="Vehicle">
        <property name="Type" not-null="true"/>
        <component name="OdometerReading">
            <property name="Miles" />
            <property name="Date" />
        </component>
        <loader query-ref="vehicle"/>
    </class>
    

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多