流畅的NHibernate映射具有孤立子记录的父/子表

时间:2012-12-04 14:06:11

标签: nhibernate foreign-key-relationship fluent outer-join orphan

我是Fluent NHibernate和C#.NET的新手,并且正在努力解决这个问题。

我有两张桌子:

审计:  audit_seq(主键),  user_code(外键),  audit_date

用户名:  user_code(主键),  USER_NAME

审计表包含具有用户的外键字段(user_code)的审计记录。 问题是某些用户记录已被删除,但这些用户的审核记录仍然存在(因此我在审核表中有孤立的外键)。我想要的是一个带有audit_seq,audit_date和user_name的结果集(但如果孤立,则user_name应为空白)。

我使用以下映射,但相信我需要更改UserName引用以创建外部联接。我不知道该怎么做。

public class AuditMap : ClassMap<Audit>
{
    public AuditMap()
    {
        Id(x => x.AuditSeq).Column("audit_seq").GeneratedBy.Assigned();
        Map(x => x.AuditDate).Column("audit_date");
        References(x => x.UserName).Column("user_code");
    }
}

1 个答案:

答案 0 :(得分:3)

username应该映射到实体(类UserName?我将使用User来区分其属性UserName)。然后它可以在 Audit 中用作参考。在C#

public class Audit
{
  ...
  public virtual User User { get; set; }
  public virtual string UserName
  {
    get { return User != null ? User.UserName : string.Empty ;}
  }
}

User映射

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserCode).Column("user_code").GeneratedBy.Assigned();
        Map(x => x.UserName).Column("user_name");
        ...
    }
}

然后我们可以这样调整Audit映射:

public class AuditMap : ClassMap<Audit>
{
    public AuditMap()
    {
        Id(x => x.AuditSeq).Column("audit_seq").GeneratedBy.Assigned();
        Map(x => x.AuditDate).Column("audit_date");
        References(x => x.User).Column("user_code")
             .NotFound.Ignore();
    }
}

现在我们Audit引用了User。它将忽略一些引用的用户丢失的事实(.NotFound.Ignore())。如果有,我们的UserName属性将返回其名称。