NHibernate несколько ссылок на одну и ту же запись из одного объекта - PullRequest
0 голосов
/ 15 сентября 2010

Я использую Fluent NHibernate, и у меня есть следующие настройки:

Объект Address , представляющий собой простой список полей адреса.

A Company объект, который имеет две ссылки на адресные объекты, MainAddress, InvoiceAddress.

Проблема, с которой я столкнулся, заключается в том, что иногда MainAddress и InvoiceAddress могут ссылаться на одну и ту же запись в Адрес таблица.

Адреса ищутся путем поиска, используя что-то вроде:

ICriteria c = session.CreateCriteria(typeof(Address))
            .Add(Example.Create(address).ExcludeNone());

Поскольку каждый Адрес выбирается отдельно, это приводит к двум экземплярам одной и той же записи, в результате чего NHibernate рвется при попытке сохранить объект Company .

"другой объект с тем жезначение идентификатора уже было связано с сеансом "

Как лучше всего обойти это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Если вы не выбрали в разных сеансах , а затем смешали их (что неверно), поведение NHibernate по умолчанию заключается в получении одного и того же экземпляра для одной и той же строки, независимо от того, сколько раз вы запрашиваете.

Убедитесь, что вы используете один сеанс.

1 голос
/ 15 сентября 2010

Вы должны использовать Merge.

слияние ():

  • , если в настоящее время существует постоянный экземпляр с тем же идентификаторомсвязанный с сеансом, скопируйте состояние данного объекта в постоянный экземпляр
  • , если в данный момент нет постоянного экземпляра, связанного с сеансом, попробуйте загрузить его из базы данных или создать новый постоянный экземпляр
  • постоянный экземпляр возвращается
  • данный экземпляр не становится связанным с сеансом, он остается отсоединенным

Это то же самое, что SaveOrUpdateCopy, ноэта команда, по-видимому, устарела :

Я думаю, SaveOrUpdateCopy - это то, что вышло из NHibernate навсегда, а Merge - это что-то добавленное в 2.1 (явно что-то перенесенноеиз спящего).В любом случае, я очень рад, что у NHibernate есть такая возможность, потому что написание и обработка операции слияния вручную - скучный код для написания!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...