在休眠/休眠中读取(错误?)id字段

本文关键字:休眠 字段 错误 id 读取 | 更新日期: 2023-09-27 18:36:09

我正在写入应用程序的数据库日志。 表中的字段之一是引用用户名的userprofile_id字段。 这是一个可为空的字段,因为某些内容在没有用户上下文的情况下写入日志。

在NHibernate中,要收集用户名,我真的不能看引用列,而是查看引用的对象。 在大多数情况下,这很好;如果为 null,则没有用户名。 因此,当尝试显示与日志关联的用户名时,我实际上必须引用Log.User.UserName

转折之处在于我有一个系统帐户,具有一组严格的权限,并且没有关联的用户配置文件来通过 api 接口调用自动化任务。 它作为userprofile_id系统写入日志,而我的UserProfiles表中不存在该系统。

为了完成这项工作,我不得不删除日志表和UserProfiles表之间的外键,但数据被记录下来,NHibernate似乎并不关心。 它只是将UserProfile对象报告为 null,这在技术上是正确的。

我实际上希望通过 NHibernate 查看userprofile_id字段的文本,即使它不会加入UserProfiles表,因此我可以区分没有用户上下文的日志条目和具有系统函数上下文的日志条目。

有没有办法在 (N)Hibernate 中请求引用字段的值,而不是关联的对象? 还是我必须做一些定制的事情?

在休眠/休眠中读取(错误?)id字段

只需将另一个属性添加到日志条目类,并将其作为属性映射到userprofile_id列即可。

也就是说,我认为您应该像处理所有其他帐户一样处理系统帐户,并将其权限存储在数据库中。

编辑

要说明解决方法,请执行以下操作:

public class Log
{
    public virtual User User { get; set; }
    //Add this property
    public virtual string UserProfileId { get; set; }
    public string UserProfileName
    {
        get { return User != null ? User.Name : UserProfileId; }
    }
}

并将其映射到列:

public class LogMap : ClassMap<Log>
{
    public LogMap()
    {
        //Map it with this:
        Map(l => l.UserProfileId).Column("userprofile_id");
        //Don't change the existing mappings
        References(l => l.User);//...
    }
}
如果 Log

的userprofile_id为 null,则 Log.User 将为 null。您可以通过引用的属性进行检查,例如,

Log.User==null

或者像这样查询,

session.Query<Log>().Where(l=>l.User==null).ToList()

这将获取没有用户的实体(带有 userprofile_id 的日志为 null)。

依赖 not-found=ignore 被认为是一种旨在帮助处理遗留数据库的功能 - 而不是应该设计到新系统中的功能。有一些负面的性能方面。最好确保您拥有正确的外键,或者根本不将其映射为 NHibernate 中的引用(即从日志中删除可导航性到用户) - 相反,如果您需要的不仅仅是用户名本身,您将调用用户查找方法。