NHibernate - Устанавливает внешний ключ в нуль, когда ссылка на объект удалена - PullRequest
1 голос
/ 14 марта 2012

Должен быть простой ответ на этот вопрос, который я скучаю.Я видел много примеров того, как сделать это в простых отношениях родитель / потомок, но я не уверен, как это сделать, когда есть третья таблица.Я также относительно новичок в NHibernate, поэтому, пожалуйста, держитесь со мной.

У меня есть класс PhoneBook, в котором есть список PhoneNumber.Тогда у меня есть другой класс "Account", который ссылается на PhoneNumber.Эта ссылка может быть недействительной, поэтому учетная запись не должна иметь телефонный номер.

Я хотел бы иметь возможность сохранить телефонную книгу, сохранить / обновить / удалить все телефонные номера, И если таковые имеютсяиз телефонных номеров удалены, я хочу удалить все учетные записи, использующие этот номер.Все работает, кроме последней части;если я удаляю номер телефона, который используется, он также удаляет учетную запись, чего я не хочу, я просто хочу, чтобы он очистил его ссылку.Я уверен, что это просто потому, что мои каскады или отображения неверны, я просто не знаю, как их установить.

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

var session = SessionFactory.GetCurrentSession();
book = (PhoneBookDto) session.Merge(book);
session.SaveOrUpdate(book);

Текущие соответствующие сопоставления:

PhoneBook.hbm.xml

...
<bag cascade="all-delete-orphan" inverse="true" name="PhoneNumbers">
  <key>
    <column name="phone_book_id" />
  </key>
  <one-to-many class="DataLibrary.dto.PhoneNumberDto, DataLibrary" />
</bag>
...

PhoneNumber.hbm.xml

...

<many-to-one cascade="none" class="DataLibrary.dto.PhoneBookDto, DataLibrary" name="PhoneBook">
  <column name="phone_book_id" />
</many-to-one>

...

Account.hbm.xml

...

<many-to-one cascade="none" class="DataLibrary.dto.PhoneNumberDto, DataLibrary" name="PhoneNumber">
  <column name="phone_number_id" />
</many-to-one>

...

Заранее спасибо!

изменить:

Firo указал мне правильное направление, мне пришлось настроить коллекцию на PhoneNumber обратно в Account, хотя она мне на самом деле не нужна, а также установить ее как обратный = false:

<bag cascade="none" inverse="false" name="Accounts">
  <key>
    <column name="phone_number_id" />
  </key>
  <one-to-many class="DataLibrary.dto.AccountDto, DataLibrary" />
</bag>

Когда я это сделал, это сработало.Есть ли способ сделать это, чтобы мне не нужно было связывать PhoneNumber с учетной записью?

1 Ответ

1 голос
/ 14 марта 2012

«почему я должен объединить, чтобы убедиться, что телефонные номера удалены»:

Либо потому, что вы удалили номера телефонов из отслеживания изменений (закрытый сеанс, в который была загружена книга), либо потому, что в конце нет сброса, в то время как объединение немедленно очистит, SaveOrUpdate добавит только пакет, выполненный в следующем сеансе. Flush ().

"он также удаляет учетную запись"

может быть из-за:

<bag cascade="all" class="Account" name="Accounts">
</bag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...