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

标签 c# .net nhibernate

我在休眠时有一个奇怪的行为。问题是 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/

相关文章:

c# - 总是遍历业务层到达数据层?

c# - 为什么我的 GTK# 编译二进制文件(使用 MonoDevelop 创建)不能在 Windows 上运行?

c# - 多线程和表单调用不同步

c# - 将金额字符串解析为数字

.net - 从字符串验证 Uri

nhibernate - 支持部分版本的 .NET 数据库迁移

.net - 如何使 NHibernate 缓存获取的子集合?

c# - 使用被忽略的属性的 QueryOver

c# - 为什么 C# 数组没有 Count 属性?

c# - 为什么对 Azure Document DB 的第一个请求比后续请求慢得多?