Nhibernate不级联删除

本文关键字:删除 级联 Nhibernate | 更新日期: 2023-09-27 17:50:46

我有一个非常简单的问题与nhibernate(我刚开始使用它)

我有以下hbm映射文件:

<class name="Customer" table="Customers" lazy="false">
<id name="Id" column="CustomerId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<bag name="Orders" cascade="all-delete-orphan" lazy="false">
  <key column="CustomerId" />
  <one-to-many class="Order" />
</bag>
</class>
<class name="Order" table="Orders" lazy="false">
<id name="Id" column="OrderId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<bag name="Products" cascade="all-delete-orphan" lazy="false"
  <key column="OrderId" />
  <one-to-many class="Product" />
</bag>
</class>
<class name="Product" table="Products" lazy="false">
<id name="Id" column="ProductId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<property name="ProductStr" />
</class>

客户类有一个int型id,字符串名称,字节[]图片和订单列表。

订单类有一个int型id、字符串名称、字节[]图片和产品列表。

产品类有一个int id,字符串名称,byte[]图片,字符串productstr和int数量(我目前不使用)

客户表有一个客户id,名字和照片(varbinary(max))

订单包含订单id、名称、图片和客户id

Product有产品id、名称、图片、productstr和订单id。

问题:当我使用session.Delete(csCustomer)删除客户时,它成功地从数据库中删除了整个客户,但没有删除其所有订单。它只在已删除客户的所有订单的客户id字段中设置null。

谁能发现我的配置有问题?我看到了一个使用nhibernate的例子,他们在订单类中保存了对客户的引用,并在产品类中保存了对订单的引用,我需要做些什么来修复它吗?

Nhibernate不级联删除

你必须在你的包上设置inverse="true"

你的客户映射应该是这样的:

<class name="Customer" table="Customers" lazy="false">
<id name="Id" column="CustomerId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<bag name="Orders" cascade="all-delete-orphan" inverse="true" lazy="false">
  <key column="CustomerId" />
  <one-to-many class="Order" />
</bag>
</class>

这里有一篇关于这个属性的好文章,Ayende很久以前就写过了。

我建议您扩展您的订单映射,引用您的客户添加:

<many-to-one name="Customer" column="CustomerId" not-null="true"/>

并将虚拟属性添加到您的类中:

public virtual Customer Customer { get; set; }

这里有更多的信息

您可能要考虑的另一件事是将bag更改为set,因为bag允许重复,如这里所述。