使用NHibernate的时态数据

时间:2009-10-28 09:57:05

标签: nhibernate event-listener temporal

任何人都可以提供一些有关如何使用NHibernate实现时态状态表的提示/指针/链接吗?即,每个实体表都有 start_date end_date 列,用于描述此行被视为有效的时间间隔。
当用户插入新实体时, start_date 接收'now'而 end_date 将为null(或者是将来的日期,我还没有决定) 。
更新时,我想将UPDATE查询更改为以下内容:

  1. 更新此实体行的end_date和
  2. 使用当前日期/时间和空end_date插入新行。
  3. 我尝试使用事件侦听器为1手动编写UPDATE查询,但似乎无法弄清楚如何为2实现新的INSERT查询。

    这是正确的方法吗?或者我在这里完全不合适?

4 个答案:

答案 0 :(得分:2)

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

对于'时间实体',NH仅作为插入/选择引擎。删除和更新由不同的实用程序完成,其中NH的ORM部分很方便。

如果你只有一些时态实体,你可能只使用nhibernate但是准备编写自己的代码以确保状态关系有效。 我们在第一次尝试中走了那条路线,在时间实体的数量开始加起来后,机制被有效地打破了。

现在,插入不需要任何特殊工具,只需将值放在适当的日期时间属性中即可设置。我们使用过滤器实现选择(明确检查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

,就会清楚使用自定义工具进行更新/删除的原因

要直接回答您的问题, NULL _end值和将来的值都可以使用(但更喜欢NOT-NULL解决方案,它会使您的查询更容易,因为您不必查看ISNULL)。

对于更新,您可以有效地复制原始实体,然后将原始实体的_end设置为now,然后转到克隆并更改相关属性,将_start更改为now,_end to the future-future值

答案 1 :(得分:1)

我建议来自Martin Fowler的优秀timeNarrative

答案 2 :(得分:0)

我认为最好的方法是使用类似Java地图的东西(抱歉,我是Java程序员)并让NHibernate映射它。地图会将具有“开始”和“结束”字段的句点映射到值。您可以编写UserType以将Period映射到两个不同的数据库列

答案 3 :(得分:0)

虽然这篇文章已有几年历史,但这种模式似乎仍然有效。我还没有使用过这个,但我需要在当前项目中使用类似的解决方案,并按照它的描述方式对其进行建模here