как удалить fk детей в nhibernate - PullRequest
1 голос
/ 03 июня 2010

Я хочу удалить ценовые списки ICollection из продукта.

Я использую следующий метод. Однако они, кажется, не удаляются. Чего мне не хватает Когда я сделаю шаг. я заметил, что "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; }  
    }

Вот sql от nhprof

// ВЫБЕРИТЕ product0_.Id as Id0_0_ ИЗ продуктов product0_ ГДЕ product0_.Id = 23 / * @ p0 * /

, а затем

ВЫБЕРИТЕ pricebreak0_.ProductId as ProductId1_, pricebreak0_.Id as Id1_, pricebreak0_.Id as Id1_0_, pricebreak0_.ProductId as ProductId1_0_, ОТ PriceBreaks Pricebreak0_ ГДЕ Pricebreak0_.ProductId = 23 / * @ p0 * /

обновления нет или выберите

Ответы [ 2 ]

1 голос
/ 03 июня 2010

Вы пытались удалить каскад = "все" на стороне PriceBreak?

Вы пытались использовать session.Save () вместо SaveOrUpdate ()?

1 голос
/ 03 июня 2010

Продукт, вероятно, должен быть связан с этим сеансом. Похоже, вы пытаетесь сохранить отдельный объект. Это означает, что нет сеанса для отслеживания этого вызова, чтобы очистить 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();
    }
}

или переместите управление сеансом и транзакциями дальше. Что в принципе исключило бы необходимость в этом методе.

...