gpt4 book ai didi

c# - Nhibernate 不级联删除

转载 作者:搜寻专家 更新时间:2023-10-30 22:15:18 24 4
gpt4 key购买 nike

我有一个非常简单的 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、字符串名称、byte[] 图片和 IList of Orders。

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 的示例,他们在订单类中保存了对客户的引用,并在产品类中保存了对订单的引用,我需要做些什么来修复它吗?

最佳答案

你必须在你的包上设置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 .

您可能要考虑的另一件事是用 set 更改 bag,因为 bag 允许重复项,如 here 所述。 .

也许可以使用 encapsulation 加强您的域.

关于c# - Nhibernate 不级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com