0

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

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

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

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

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

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

4

3 回答 3

1

只需将另一个属性添加到您的日志条目类并将其作为属性映射到 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);//...
    }
}
于 2013-10-21T12:12:14.397 回答
0

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

Log.User==null

或这样的查询,

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

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

于 2013-10-21T12:21:05.867 回答
0

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

于 2013-10-22T12:46:13.030 回答