NHibernate не удаляет запись БД, когда объект установлен в ноль? - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть два класса: Семья и Адрес. У семьи есть физический адрес и почтовый адрес.

Файл сопоставления для Family выглядит следующим образом:

....
<id name="Id" column="Id" type="Int32" unsaved-value="0">
  <generator class="native"></generator>
</id>
<many-to-one name="PhysicalAddress" class="Address" column="PhysicalAddressId" cascade="all" unique="true" />
<many-to-one name="MailingAddress" class="Address" column="MailingAddressId" cascade="all" unique="true" />
...

Файл сопоставления для адреса выглядит так:

...
<id name="Id" column="Id" type="Int32" unsaved-value="0">
  <generator class="native"></generator>
</id>
<property name="StreetAddress1" column="StreetAddress1" />
<property name="StreetAddress2" column="StreetAddress2"/>
<property name="City" column="City" />
<property name="State" column="State" />
<property name="ZipCode" column="ZipCode" />
...

(Обратите внимание, что Family-PhysicalAddress и Family-MailingAddress являются отношениями один-к-одному.)

Я хотел бы, чтобы, когда я выполняю

aFamily.MailingAddress = null;
session.Save(aFamily);
session.Flush();

Я ожидаю, что NHibernate автоматически удалит запись почтового адреса из SQL Server для меня.

НО, этого не происходит. NHibernate не удаляет адресную запись из SQL Server.

Есть ли способ заставить его работать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 декабря 2009

Это поведение не поддерживается NHibernate. Конечно, проблема в том, что у вас, вероятно, нет доступа к сеансу NHibernate в логике вашего домена, где вносятся изменения.

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

Вот обсуждение этого сценария: http://colinjack.blogspot.com/2008/03/nhibernate-gotchas-orphans-and-one-to.html

И ссылка на тикет по вопросу: https://nhibernate.jira.com/browse/NH-1262

0 голосов
/ 15 декабря 2009

К сожалению, NHibernate в настоящее время не поддерживает автоматическое удаление сирот для многих к одному (Hibernate v3 в Java поддерживает его) Он поддерживается только в списках (cascade = "all-delete-orphan").

То, что вы можете попытаться сделать, это использовать сопоставление компонентов. Может быть, есть возможность встроить многие-к-одному в компонент.

Но я думаю, что было бы лучше явно удалить связанный объект.

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