实际上,如果我工作,我们有一个可行的解决方案,但它有效地杀死了 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 设置为现在,然后转到克隆并更改相关属性,将 _start 更改为现在,将 _end 更改为将来的值