代码之家  ›  专栏  ›  技术社区  ›  Yuval

使用nhibernate的时间数据

  •  3
  • Yuval  · 技术社区  · 15 年前

    有谁能提供一些关于如何用nhibernate实现时态表的提示/指针/链接吗?即,每个实体表都有 启动日期 末日 描述此行被视为有效的时间间隔的列。
    当用户插入新实体时, 启动日期 接受“现在”和 末日 将为空(或是一个遥远的未来,我还没有决定)。
    更新时,我要将更新查询更改为以下内容:

    1. 更新此实体行的结束日期,以及
    2. 插入具有当前日期/时间和空结束日期的新行。

    我尝试使用事件侦听器手动为1编写更新查询,但似乎无法确定如何为2实现新的插入查询。

    这是正确的方法吗?或者我完全偏离了目标?

    4 回复  |  直到 12 年前
        1
  •  2
  •   Jaguar    14 年前

    实际上,我们有一个可行的解决方案,如果我工作,但它有效地杀死了一部分NHibernate的机制。

    对于“临时实体”,nh仅充当插入/选择引擎。删除和更新由另一个实用程序完成,nh的orm部分很方便。

    如果您只有少量的时间实体,那么您可以只使用nhibernate,但要准备好编写自己的代码,以确保状态关系是有效的。 我们在第一次尝试中就走了这条路,在时间实体的数量开始增加之后,这个机制就被有效地打破了。

    现在,插入不需要特殊的工具,只需将值放在适当的datetime属性中,就可以设置了。我们使用过滤器实现select(当然要检查nh ref的16.1,因为它有一个例子,但是条件不能使用between),尽管这样做的话 必须修改nh源代码,以便对所有类型的选择应用过滤器。 查看我的帖子 http://savale.blogspot.com/2010/01/enabling-filters-on-mapped-entities.html 因为那样做。

    如果您在映射上指定了“where”子句(而不是过滤器),但我还没有尝试或测试它,而且据我所知,映射上映射的“where”不支持参数(至少官方不支持)。

    如我所说,一旦你阅读了Richard Snodgrass关于时态数据库的书籍,使用自定义工具进行更新/删除的原因就会变得很清楚 http://www.cs.arizona.edu/~rts/publications.html

    直接回答你的问题 无效的 _结束值和一个远在将来的值将起作用(但更喜欢非空的解决方案,它将使您的查询更容易,因为您不必使用isnull进行检查)。

    对于更新,您可以有效地克隆原始实体,然后将原始实体的“结束”设置为“现在”,然后转到克隆的并更改相关属性,将“开始”更改为“现在”,将“结束”更改为“将来很远的”值。

        2
  •  1
  •   Eat at Joes    12 年前

    我建议最好的 timeNarrative 马丁·福勒的信。

        3
  •  0
  •   cdarwin    14 年前

    我认为最好的方法是有点像Java地图(对不起,我是Java程序员),让NHiBiNATE来映射它。映射将类似于句点的内容(带有“开始”和“结束”字段)映射到一个值。您可以编写一个usertype来将句点映射到两个不同的数据库列

        4
  •  0
  •   shanabus    13 年前

    虽然这篇文章已经有几年历史了,但这种模式似乎仍然有效。我还没有使用这个,但我需要一个类似的解决方案在当前的项目中,并将建模的方式,它被描述 here .