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

通过NHibernate检索/保存链接到其他实体的日志条目的最佳方式是什么?,nhibernate,orm,fluent-nhibernate,nhibernate-mapping,Nhibernate,Orm,Fluent Nhibernate,Nhibernate Mapping,免责声明:为了强调我问题的要点,我将简略地描述一下 我正在使用的应用程序维护一组资源。我们在NHibernate中有一个对应的表和映射的实体。每个资源由整数id标识。我们还有用户表和相应的实体来维护用户配置文件 我们需要记录用户对应用程序的访问并检索访问历史。对于repository类,我们必须引入两种方法: IEnumerable GetUserLog(用户用户)按日期按降序检索用户访问历史记录 作废WriteGentry(用户、资源)以写入新条目 我试图简单地将LogEntry实体定义如下:

免责声明:为了强调我问题的要点,我将简略地描述一下

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

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

  • IEnumerable GetUserLog(用户用户)按日期按降序检索用户访问历史记录
  • 作废WriteGentry(用户、资源)以写入新条目
  • 我试图简单地将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
    })
    
    Session.Query().Where(entry=>entry.User=currentUser).OrderByDesc(entry=>entry.Date)
    Session.Save(新日志条目(){
    用户=当前用户,
    资源=资源,
    日期=日期时间。现在
    })
    
    这是我们处理这个问题最方便的方式

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

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

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


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

    您是否考虑过为日志条目表引入Id字段?

    许多DBA都会推荐它,它似乎是最简单的解决方案。

    谢谢您的建议。有道理,你的建议似乎是次要的。