在hibernate / nhibernate中读取(坏?)id字段

时间:2013-10-21 11:41:38

标签: c# hibernate postgresql nhibernate logging

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

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

扭曲的原因在于我拥有一个系统帐户,该帐户具有一组严格的权限,并且没有相关的用户配置文件可通过api界面调用自动化任务。它将日志写为userprofile_id system ,这在我的UserProfiles表中不存在。

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

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

在(N)Hibernate中有没有办法请求引用字段的值,而不是相关的对象?或者我将不得不做一些自定义的事情?

3 个答案:

答案 0 :(得分: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);//...
    }
}

答案 1 :(得分:0)

如果Log的userprofile_id为null,则Log.User将为null。您可以通过引用的属性(

)进行检查
Log.User==null

或像这样的查询,

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

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

答案 2 :(得分:0)

依赖于not-found = ignore被认为是一种旨在帮助遗留数据库的功能 - 而不是应该设计到新系统中的功能。有一些负面的表现方面。最好确保你有合适的外键,或者根本不在NHibernate中将它作为参考映射(即从日志到用户删除导航) - 如果你需要的话,你会称之为用户查找方法。用户名本身。