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

Posted

技术标签:

【中文标题】通过 NHibernate 检索/保存链接到其他实体的日志条目的最佳方法是啥?【英文标题】:What is the best way to retrieve/save log entries linked to other entities through NHibernate?通过 NHibernate 检索/保存链接到其他实体的日志条目的最佳方法是什么? 【发布时间】:2011-04-19 14:33:13 【问题描述】:

免责声明:我正在概述简化的图片以强调我的问题的要点。

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

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

    IEnumerable GetUserLog(User user) 按日期降序检索用户访问历史记录和 void WriteLogEntry(User user, Resource resource) 写入新条目

我试图简单地定义 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,唯一的选择是映射用户、资源和日期列,因为只有这种组合才能提供唯一性。同样在复合 id 的情况下,我们必须覆盖 Equals 和 GetHashCode,对于这样一个简单的任务来说,所有这些似乎都是多余的。 id字段不能使用延迟加载的另一个问题也是太多了。我们不想提前加载所有相关的 Resource 实体。

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的好建议。有道理,你的提议似乎是较小的邪恶。

以上是关于通过 NHibernate 检索/保存链接到其他实体的日志条目的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 NHibernate ISession 缓存主键未检索到的实体

插入 nhibernate sql server 后无法检索生成的 id

通过 NHibernate 代码映射将 GUID 属性作为外键映射到其他实体

无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键

NHibernate - 如何使用 where 子句保存对象

NHibernate 可以在没有迭代器的情况下保存集合吗?