gpt4 book ai didi

c# - NHibernate 在删除之前更新行?

转载 作者:太空狗 更新时间:2023-10-29 20:11:42 25 4
gpt4 key购买 nike

我在休眠时有一个奇怪的行为。问题是nhibernate 在删除实体之前执行更新。我有一个类别类和一个产品类。类别有一袋产品。当我从类别中删除产品时,nhibernate 会执行以下:

  • 它更新我从集合中删除的产品实体
  • 它从数据库中删除产品实体。

这是映射

  <class name="Category"> 
<id name="Id">
<generator class="hilo" />
</id>
<property name="Name" lazy="false" length="20" />

<bag name="Products" cascade="all-delete-orphan" lazy="false"
inverse="false">
<key column="CategoryId" />
<one-to-many class="Product" />
</bag>
</class>

<class name="Product">
<id name="Id">
<generator class="hilo" />
</id>
<property name="Name" lazy="false" />
<property name="Discontinued" lazy="false" />
<property name="Price" lazy="false" />
<many-to-one name="Category"
class="Category"
column="CategoryId"
cascade="none" />
</class>

这是代码

    using (var session = NHibernateHelper.OpenSession()) 
using (var transaction = session.BeginTransaction())
{
var c1 = session.Load<Category>(32768);
c1.Ps.RemoveAt(0);

session.SaveOrUpdate(c1);
transaction.Commit();
}

结果如下:

exec sp_executesql N'UPDATE Product SET CategoryId = null WHERE 
CategoryId = @p0 AND Id = @p1',N'@p0 int,@p1 int',@p0=32768,@p1=65537
go

exec sp_executesql N'DELETE FROM Product WHERE Id = @p0',N'@p0
int',@p0=65537
go

谁能解释这种奇怪的行为?

谢谢。

最佳答案

将类别上的产品包的定义更改为 true。将 inverse 设置为 false 告诉 NHibernate Category 对象是关系上键的所有者。

将 Products 集合的 inverse 设置为 false,NHibernate 将 Category 视为关系的所有者。因此,当 Products 集合更改时,它会发出更新语句以从 Category 中删除 Product。然后发生删除,因为产品已被删除。

关于c# - NHibernate 在删除之前更新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763837/

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