У меня есть следующая структура базы данных, которая я не могу изменить:Mapping кодом ноль-Or-One отношения
CREATE TABLE Users (
ID INT NOT NULL IDENTITY(1,1),
PRIMARY KEY(ID)
)
CREATE TABLE UserAvatars (
UserID INT NOT NULL,
Width INT NOT NULL,
Height INT NOT NULL,
PRIMARY KEY(UserID),
FOREIGN KEY(UserID) REFERENCES Users(ID),
)
В принципе, пользователь может иметь Ноль-или-один аватар (я удалил столбцы, чтобы упростить пример).
class User
{
public int ID { get; protected set; }
public UserAvatar Avatar { get; set; }
}
class UserAvatar
{
public User User { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}
Я использую следующее отображение:
class UserMapping : ClassMapping<User>
{
public UserMapping()
{
Id(x => x.ID, m => {
m.Generator(Generators.Identity);
});
OneToOne(x => x.Avatar);
}
}
class UserAvatarMapping : ClassMapping<UserAvatar>
{
public UserAvatar()
{
Id(x => x.User, m =>
{
m.Generator(Generators.Foreign<User>(u => u.ID));
});
Property(x => x.Width);
Property(x => x.Height);
}
}
Однако при попытке запустить мое приложение, я получаю NHibernate.MappingException
:
NHibernate.MappingException: Не удалось скомпилировать отображение документа : mapping_by_code ----> NHibernate.MappingException: не удалось определить тип для: MyApp.Models.UserAvatar, MyApp, для столбцов: NHibernate.Mapping.Column (Пользователь)
Я не могу понять смысл этой загадочной ошибки.
Как выполнить сопоставление, где User
может иметь ноль или один аватар?
Спасибо за это, я постараюсь это завтра, когда я на работу. Есть ли у вас ссылка на сопоставление по коду (не беглое nhibernate)? Не беспокойтесь, если вы этого не сделаете. – Matthew
Да, есть истории, как использовать сопоставление по коду. Один-к-одному здесь: http://notherdev.blogspot.cz/2012/01/mapping-by-code-onetoone.html, * index * из них находится здесь: http://notherdev.blogspot.cz /2012/02/nhibernates-mapping-by-code-summary.html –
Спасибо @Radim, это очень помогло в решении проблемы. Я собираюсь опубликовать свое решение, которое использует сопоставление по коду. – Matthew