当object被设置为null时,NHibernate不会删除db记录?

时间:2009-12-14 23:01:25

标签: nhibernate

我有两个班:家庭和地址。 一个家庭有一个实际地址和一个邮寄地址。

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 个答案:

答案 0 :(得分:1)

NHibernate不支持此行为。当然问题是您可能无法访问域逻辑中进行更改的NHibernate会话。

一种可能 - 虽然不可否认是不理想的解决方案 - 只是运行另一个进程来清理孤立的实体。

以下是对此场景的讨论: http://colinjack.blogspot.com/2008/03/nhibernate-gotchas-orphans-and-one-to.html

此问题的票证链接: https://nhibernate.jira.com/browse/NH-1262

答案 1 :(得分:0)

不幸的是,NHibernate目前不支持自动删除orhphans多对一(Java中的Hibernate v3确实支持它)。它仅在列表上受支持(cascade =“all-delete-orphan”)。

您可以尝试做的是使用组件映射。也许可以将多对一嵌入到组件中。

但我认为明确删除相关对象会更好。