通过NHibernate检索/保存链接到其他实体的日志条目的最佳方法是什么?

时间:2011-04-19 14:33:14

标签: nhibernate orm fluent-nhibernate nhibernate-mapping

免责声明:我概述了简化图片,以强调我的问题的主要观点。

我正在处理的应用程序维护着一组资源。我们在NHibernate中有一个对应的表和映射实体。每个资源由整数id标识。我们还有用户表和相应的实体来维护用户配置文件。

我们需要记录对应用程序的用户访问并检索访问历史记录。对于存储库类,我们必须引入两种方法:

  1. IEnumerable GetUserLog(用户用户)按日期降序检索用户访问历史记录和
  2. void WriteLogEntry(用户用户,资源资源)写入新条目
  3. 我试图简单地将LogEntry实体定义如下:

    public class LogEntry
    {
         public virtual User User {get; set;}
         public virtual Resource Resource {get; set;}
         public virtual DateTime Date {get; set;}
    }
    

    并使用Fluent NHibernate进行映射。要检索/更新日志条目,我们只需使用

    即可
    Session.Query<LogEntry>().Where(entry => entry.User = currentUser).OrderByDesc(entry => entry.Date)
    Session.Save(new LogEntry() {
        User = currentUser,
        Resource = resource,
        Date = DateTime.Now
    })
    

    这是我们处理此问题的最便捷方式。

    问题 问题是NHibernate需要id映射。我们必须在这里使用复合ID,唯一的选择是映射User,Resource和Date列,因为只有这个组合才能提供唯一性。同样在复合id的情况下,我们必须重写Equals和GetHashCode,所有这些对于这样一个简单的任务来说似乎有些过分。另一个问题是延迟加载不能用于id字段,而且它也太多了。我们不希望提前加载所有相关的资源实体。

    另一种可能的解决方案是定义普通类,而不是实体,然后使用SetResultTransformer(Transformers.AliasToBean())来检索结果。在这种情况下,我们必须手动构建查询,手动检索相关实体,这样一般情况下处理原始连接并不是更好。

    我想问专家意见,因为我相信周围的人有类似的经验,可以提供帮助。提前谢谢。

    P.S。这是使用NHibernate 3(+ Fluent)的ASP.NET MVC应用程序。日志信息将用于显示用户访问的最后5-10个资源。

1 个答案:

答案 0 :(得分:1)

您是否考虑过为LogEntry表引入Id字段? 许多DBA会推荐它,它似乎是最简单的解决方案。