2010-06-03 3 views
1

Product에서 ICollection PriceBreaks를 삭제하고 싶습니다.nhibernate에서 fk children을 삭제하는 방법

다음 방법을 사용하고 있습니다. 그러나 그들은 삭제하지 않는 것 같습니다. 나는 무엇이 없는가. 내가 단계를 밟을 때. 나는 "product.PriceBreaks.Clear();" 실제로 항목을 지우지는 않습니다. 나는 물 내리는 것과 같은 것을 필요로합니까?

공공 무효 RemovePriceBreak (INT 제품 일련) {

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; } 
    } 

있습니다 여기 가 SELECT product0_.Id가 Id0_0_ 으로 제품의 product0_ //

nhprof에서 SQL은 WHERE product0_.Id = 23/* @ P0의 */

하고

SELECT pricebreak0_.ProductId ProductId1_, Id1_ 같은 pricebreak0_.Id, Id1_0_ 같은 pricebreak0_.Id, ProductId1_0_ 같은 pricebreak0_.ProductId, 같은 FROM PriceBreaks pricebreak0_ WHERE pricebreak0_.ProductId = 23/* @ P0 */

업데이트 또는 선택 사항 없음

답변

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(); 
    } 
} 

위로 이동하거나 세션 및 트랜잭션 관리를 위로 이동하십시오. 기본적으로이 방법의 필요성을 없애줍니다.

+0

흠, 이거 줘. 아직도 기쁨이 없습니다. 위의 질문을 새로운 방법으로 업데이트했습니다. – frosty

+0

엔티티와이 두 엔티티 간의 관계를 관리하는 방법을 보여줄 수 있습니까? 컬렉션을 목록으로 노출하는 것 같습니다. 그 생각을 다시하고 싶을 수도 있습니다. 예를 들어 product.PriceBreaks [0] .product = someOtherProduct는 무엇을 의미합니까? – epitka

+0

에픽카, 나는 entites를 추가했습니다. 목록에 표시 할 대안이 있습니까? – frosty

1

PriceBreak 측에서 cascade = "all"을 삭제 해 보셨습니까?

SaveOrUpdate() 대신 session.Save()를 사용해 보셨나요?

+0

1) product.hmb의 priceBreak에서 cascade = "all"을 제거했습니다. 위의 내용을 지금 편집하는 방법에 대해 편집합니다. 2) 세션을 의미합니까? 저장 – frosty

관련 문제