【问题标题】:Joining NHibernate.Envers revision information to an audited entity将 NHibernate.Envers 修订信息加入审计实体
【发布时间】:2015-03-23 13:39:30
【问题描述】:

在查询实体时,是否有一种简单的方法可以连接实体的最新修订信息?

另一种方法是将属性(使用 Fluent NHibernate)映射到实体,例如entity.LatestRevisionDateTime 属性。

这是必需的,因为我们有一些屏幕显示最新的修改日期时间和修改实体的用户。我们还需要至少一个查询来返回自特定日期以来已修改的实体。如果我们不需要加入内存(更少的数据库往返,更少的内存),这将更容易和更好的性能。

我们正在使用:

  • NHibernate 4.0.3.400
  • FluentNHibernate 2.0.1.0
  • Hibernate.Envers 2.0.0

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate nhibernate-envers


    【解决方案1】:

    要在一个语句中获取实体和修订信息,您可以使用

    session.Auditer().CreateQuery()
       .ForHistoryOf<YourEntityType, YourRevisionType>()
       .Add([some filters])
       .Results()
    

    为了获取最新/当前实体和修订对象,我认为这可行(AFK 所以无法验证)

    session.Auditer().CreateQuery()
       .ForHistoryOf<YourEntityType, YourRevisionType>()
       .Add(AuditEntity.RevisionNumber().Maximize().ComputeAggregationInInstanceContext())
       .Results()
    

    【讨论】:

    • 查询 API 非常有限,当使用复杂的 NHibernate 查询来获取实体然后对每个结果使用审计查询时,它会产生一个 SELECT N+1 问题并不理想......
    • 好的。如果您找到更好/更快的方法,请随时创建拉取请求以进行 repo。关于select n+1问题...可能是这个bug引起的,nhibernate.jira.com/browse/NH-2907。请为那个投票。
    • 我想到了在普通 NHibernate 查询中使用审计表的方法,因为我相信 envers 使用 NHibernate 来访问这些表。所以它们必须在 NHibernate-Configuration 中,这样它们应该可以在查询中使用以加入...
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2015-12-14
    • 2019-10-18
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多