开发者

NHibernate doesn't delete db record when object is set to null?

I have two classes: Family and Address. A family has a physical address and a mailing address.

The mapping file for Family looks like:

....
<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" />
...

The mapping file for Address looks like:

...
<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" />
...

(No开发者_运维技巧te that Family-PhysicalAddress and Family-MailingAddress are one-to-one relationships.)

What I would like to happen is that when I execute

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

I expect NHibernate to automatically delete the mailing address record from SQL Server for me.

BUT, that doesn't happen. NHibernate does not delete the address record from SQL Server.

Is there any way I can make it work?

Thank you!


This behaviour isn't supported by NHibernate. Of course the problem is that you probably don't have access to the NHibernate session in your domain logic where the change is made.

One possible -- though admittedly not ideal solution -- is to simply run another process to clean up orphaned entities.

Here is a discussion of this scenario: http://colinjack.blogspot.com/2008/03/nhibernate-gotchas-orphans-and-one-to.html

And a link to a ticket on the issue: https://nhibernate.jira.com/browse/NH-1262


Unfortunately NHibernate currently does not support automatic deletions of orhphans for many-to-one (Hibernate v3 in Java does support it). It is only supported on lists (cascade="all-delete-orphan").

What you can try to do is to use component mapping. Maybe it is possible to embed many-to-one into a component.

But I think it would better to explicitly delete the related object.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜