Свободное сопоставление родительских и дочерних таблиц NHibernate с потерянными дочерними записями

Я новичок в 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");
    }
}

person Oliver Wastell    schedule 04.12.2012    source источник


Ответы (1)


Таблица username должна быть сопоставлена ​​с Entity (класс UserName? Я буду использовать User, чтобы отличить его свойство UserName). Затем его можно будет использовать в Аудит в качестве справочного материала. В С#

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 вернет его имя.

person Radim Köhler    schedule 04.12.2012