Nhibernate不会级联删除

时间:2013-01-06 08:52:28

标签: c# database class nhibernate nhibernate-mapping

我对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>

Customer类有一个int id,字符串名称,byte []图片和Orders的IList。

Order类有一个int id,string name,byte []图片和IList of Products。

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

客户表有客户ID,名称和图片(varbinary(max))。

订单包含订单ID,名称,图片和客户ID

产品有产品ID,名称,图片,产品和订单ID。

问题:当我使用session.Delete(csCustomer)删除客户时,它会成功地从数据库中删除整个客户,但它不会删除所有订单。 它仅在已删除客户的所有订单中的客户ID字段中输入null。

任何人都可以找到我的配置问题?我看到了一个使用nhibernate的例子,他们在订单类中保存了对客户的引用,并在产品类中引用了订单,我需要做些什么来修复它?

1 个答案:

答案 0 :(得分:3)

你必须在行李上设置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>

关于这个属性here有一篇很好的文章,Ayende很久以前就已经written了。

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

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

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

public virtual Customer Customer { get; set; }

更多信息here

您可能要考虑的另一件事是更改bag set因为包允许重复,因为here已解释过。

也许可以使用encapsulation强化您的域名。