NHibernate在删除之前更新了行?

Dav*_*ita 7 .net c# nhibernate

我对nhibernate有一种奇怪的行为.问题是nhibernate在删除实体之前执行更新.我有一个Category类和一个Product类.类别有一袋产品.当我从Category中删除产品时,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>
Run Code Online (Sandbox Code Playgroud)

这是代码

    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(); 
    }
Run Code Online (Sandbox Code Playgroud)

这是结果:

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

shf*_*301 12

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

在Products集合上将inverse设置为false,NHibernate将Category视为关系的所有者.因此,当Products集合更改时,它会发出update语句以从Category中删除Product.然后删除是因为删除了产品.