Свободное отображение 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 ответ:
На основе вашего небольшое обновление, я бы пошел с упрощенным отображением. Мы бы прибыли от 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()
)См. также:
- 5.1.10. многие к одному
- отображение кодом, Manytoon (прокрутите вниз до эквивалент Fluent NHibernate )