如何删除nhibernate中的fk子元素

时间:2010-06-03 16:28:26

标签: nhibernate nhibernate-mapping

我想从Product中删除ICollection PriceBreaks。

我正在使用以下方法。然而他们似乎没有删除。我错过了什么。  当我一步到位。我注意到“product.PriceBreaks.Clear();”实际上并没有清除这些物品。我需要冲洗还是什么?

public void RemovePriceBreak(int productId) {

using (ISession session = EStore.Domain.Helpers.NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    var product = session.Get<Product>(productId); 
   // i can see 20 PriceBreak records, tho nh prof saids PriceBreak table hasn't been hit
    product.PriceBreaks.Clear();
    session.SaveOrUpdate(product);
    transaction.Commit(); // PriceBreak table is hit here with select statement, no delete?
}

}

这是我的hbm文件

  <class name="Product" table="Products">
    <id name="Id" type="Int32" column="Id" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="CompanyId" column="CompanyId" type="Int32" not-null="true" />
    <property name="Name" column="Name"/>
    <set name="PriceBreaks" table="PriceBreaks" generic="true" cascade="all-delete-orphan" inverse="true" >
      <key column="ProductId" />
      <one-to-many class="EStore.Domain.Model.PriceBreak, EStore.Domain" />
    </set>    
  </class>



<class name="PriceBreak" table="PriceBreaks">
    <id name="Id" type="Int32" column="Id" unsaved-value="0">
      <generator class="identity"/>
    </id> 
    <many-to-one name="Product" column="ProductId"  not-null="true"  class="EStore.Domain.Model.Product, EStore.Domain" />    
  </class>

我的实体

 public class Product
    {

        public virtual int Id { get; set; }
    public virtual ICollection<PriceBreak> PriceBreaks { get; set; }
        public virtual void AddPriceBreak(PriceBreak priceBreak)
        {
            priceBreak.Product = this;
            PriceBreaks.Add(priceBreak);
        }
    }




 public class PriceBreak
    {
        public virtual int Id { get; set; }
        public virtual Product Product { get; set; }  
    }

这是来自nhprof

的sql

// SELECT product0_.Id as Id0_0_ 来自产品product0_ 产品0_.Id = 23 / * @ p0 * /

然后

选择pricebreak0_.ProductId作为ProductId1_,        pricebreak0_.Id为Id1_,        pricebreak0_.Id为Id1_0_,        pricebreak0_.ProductId为ProductId1_0_, 来自PriceBreaks pricebreak0_ pricebreak0_.ProductId = 23 / * @ p0 * /

没有更新或选择

2 个答案:

答案 0 :(得分:1)

产品可能需要与该会话相关联。看起来您正在尝试保存分离的对象。这意味着没有会话来跟踪该调用以清除PriceBreaks。把它改成这个......

public void RemovePriceBreak(int productId)
{

    using (ISession session = EStore.Domain.Helpers.NHibernateHelper.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        var product = session.Get<Product>(productId);
        product.PriceBreaks.Clear();
        session.SaveOrUpdate(product);
        transaction.Commit();
    }
}

或进一步提升会话和事务管理。这基本上不需要这种方法。

答案 1 :(得分:1)

您是否尝试删除PriceBreak方面的cascade =“all”?

您是否尝试过使用session.Save()而不是SaveOrUpdate()?