Многозначное и уникальное нарушение ограничений NHibernate - PullRequest
4 голосов
/ 14 ноября 2008

У меня проблема с попыткой смоделировать отношение многие-к-одному в NHibernate, где объект со стороны «один» имеет уникальное ограничение на столбец. Проблема заключается в следующем:

У меня есть две таблицы: «Персона» и «Страна». С каждым лицом связана одна и только одна страна. Страна может иметь много людей (на самом деле! :)), а название страны уникально. Ниже приведено сопоставление на стороне человека:

<many-to-one Name="Country">
<column Name="CountryId"/>
</many-to-one>

На селе:

<property name="Name" unique="true">
<column name="Name" length="50">
</property>

Теперь в базу данных я добавил уникальное ограничение для столбца Имя в таблице Страна. Если я вызываю Save () для экземпляра Person, NHibernate просто пытается выполнить INSERTS, тогда как я ожидаю, что он проверит, существует ли Название страны, и использует его идентификатор в столбце CountryID таблицы Person. Вместо этого выдается исключение, которое возникает в результате нарушения уникального ограничения в базе данных.

Мне кажется, что в Nibernate должно быть достаточно метаданных сопоставления, чтобы делать правильные вещи (или уникальный атрибут свойства не гарантирует этого?). Кто-нибудь знает, как это сделать или есть обходной путь?

Спасибо,

Мартейн

Ответы [ 2 ]

6 голосов
/ 15 ноября 2008

Вам необходимо назначить экземпляр Country для свойства Country экземпляра Person (а не просто установить идентификатор). Что-то вроде:

Person p = new Person();
p.Country = session.Load<Country>(countryId);
session.Save(p);

Тогда NHibernate будет знать, что делать. Это также не приведет к попаданию в БД для извлечения страны, поскольку метод Load возвращает прокси-сервер Country, и единственное, к чему вы обращаетесь - это идентификатор экземпляра Country.

0 голосов
/ 14 сентября 2009

У меня было похожее требование, и я решил его, используя SaveOrUpdateCopy .

Допустим, у вас есть два разных объекта People, и у каждого есть ссылка на свой объект Country. Пока идентификаторы Country ID одинаковы, исключений не будет, и в базе данных будет только 1 страна.

Единственное, что связано с этим подходом, - это то, что вам нужно будет назначить идентификатор для объектов вашей страны перед вызовом SaveOrUpdateCopy.

...