Свободное отображение NHibernate: один к одному (или нет)


У меня есть следующая Настройка схемы базы данных, которую я действительно не могу изменить.

User
----
Id    (primary key)
[Some simple properties...]


UserAdditionalData
------------------
Id     (primary key)
[Some simple properties...] 
USERID (foreign key to User)

Ясно, что таблица User На самом деле не имеет никакого воспоминания, связана ли она с записью UserAdditionalData, поэтому я не думаю, что могу назвать это истинным отображением один-к-одному, поскольку они также не разделяют взаимоисключающий PK.

Однако на практике я хотел бы иметь возможность работать с объектом User и, например, проверить, есть ли у него запись UserAdditionalData, и если да, то получить доступ к его свойства.

Я настроил свой BDO как таковой:

public class User
{
    [Some simple properties...] 
    public virtual UserAdditionalData UserAdditionalData { get; set; }
}

public class UserAdditionalData
{
    [Some simple properties...] 
    public virtual User User { get; set; }  /* I have this here, 
                                               but I don't really ever 
                                               have to access it in this 
                                               direction */
}

Я настроил свое отображение следующим образом:

    public UserMapping()
    {
        Table("USER");
        [Some simple properties...] 
        HasOne(x => x.UserAdditionalData).Cascade.None();
    }


    public UserExtraMapping()
    {
        Table("USER_ADDITIONAL_DATA");
        [Some simple properties...] 
        References(x => x.User, "USERID").Unique();
    }

Все это компилируется, но я вижу, что мой объект UserExtra (при доступе через объект User) всегда равен null. Я перепробовал много разных способов сделать это, много читал о реализации этого как один ко многим. Однако я все еще не могу заставить его работать.

Любая помощь была бы очень признательна.

Спасибо!

[небольшое обновление]: я только должен запрашивайте базу данных, а не сохраняйте ее, если это имеет отношение к делу.

1 2

1 ответ:

На основе вашего небольшое обновление, я бы пошел с упрощенным отображением. Мы бы прибыли от NHibernate на реальное отображение мощности, а также оптимизировать загрузку пользователей. Все это потому, что нам нужно отображение только для чтения.

Во-первых, мы должны ввести простое int свойство UserId на дополнительный класс

// extra class is having an int property containig the foreign key
public class UserAdditionalData
{
    public virtual int UserId { get; set; }
}

// that would be the mapping:
public UserExtraMapping()
{
    ...
    Map(x => x.UserId, "USERID");
}

Теперь мы будем использовать хорошо оптимизированное отображение для ленивой загрузки many-to-one (т. е. по сравнению с один-к-одному, который нагружает оба конца всегда, здесь мы получим справочные данные только в том случае, если это действительно необходимо!)

public UserMapping()
{
    ...
    References(x => x.UserAdditionalData)
          .LazyLoad()
          .PropertyRef(e => e.UserId)
          .Not.Insert()
          .Not.Update()
          ;
}

Итак, для чтения я бы лучше всего использовал many-to-one отображение (References())

См. также: