2009-09-09 2 views
2

분리 된 엔티티와 함께 ​​/ I가 수집 자식 엔티티와 상위 엔티티가NHibernate에 폭포 - 문제 내가 계단식 업데이트를 해결하기 위해 노력하고 여기에 너트려고하고

:-) 문제를 삭제합니다. 분리 된 상위 개체에서 하위 엔터티 목록을 수정하고 추가, 삭제하는 등의 작업을 수행 할 때 하위 컬렉션에 올바르게 연결된 캐스케이드가 표시되지 않습니다.

매핑 파일 :

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Domain" 
        namespace="Domain"> 

    <class name="Parent" table="Parent" > 

    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 

    <version name="LastModified" 
        unsaved-value="0" 
        column="LastModified" 
        /> 

    <property name="Name" type="String" length="250" /> 

    <bag name="ParentChildren" lazy="false" table="Parent_Children" cascade="all-delete-orphan" inverse="true"> 
     <key column="ParentId" on-delete="cascade" /> 
     <one-to-many class="ParentChildren" /> 
    </bag> 

    </class> 

    <class name="ParentChildren" table="Parent_Children"> 

    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 

    <version name="LastModified" 
        unsaved-value="0" 
        column="LastModified" 
        /> 

    <many-to-one 
    name="Parent" 
    class="Parent" 
    column="ParentId" 
    lazy="false" 
    not-null="true" 
     /> 
    </class> 
</hibernate-mapping> 

테스트

[Test] 
    public void Test() 
    { 
     Guid id; 
     int lastModified; 
     // add a child into 1st session then detach 
     using(ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession()) 
     { 
      Console.Out.WriteLine("Selecting..."); 
      Parent parent = (Parent) session.Get(typeof (Parent), new Guid("4bef7acb-bdae-4dd0-ba1e-9c7500f29d47")); 

      id = parent.Id; 
      lastModified = parent.LastModified + 1; // ensure the detached version used later is equal to the persisted version 

      Console.Out.WriteLine("Adding Child..."); 
      Child child = (from c in session.Linq<Child>() select c).First(); 
      parent.AddChild(child, 0m); 

      session.Flush(); 
      session.Dispose(); // not needed i know 
     } 

     // attach a parent, then save with no Children 
     using (ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession()) 
     { 
      Parent parent = new Parent("Test");    

      parent.Id = id; 
      parent.LastModified = lastModified; 

      session.Update(parent); 
      session.Flush(); 
     } 
    } 

나는 제품이 업데이트 된 사실이 컬렉션의 자녀가없는 것을 가정 - 아이들은 삭제 될 것입니다 Parent_Child 테이블 문제는 새로운 세션에 제품을 연결하는 것과 관련이있는 것 같습니다. 캐스케이드가 모두 삭제 - 고아로 설정되었으므로 컬렉션에 대한 변경 사항이 관련 엔티티/테이블에 전파된다고 가정합니다. 이 경우 삭제 하시겠습니까?

무엇이 여기에 있습니까?

c

+0

상위 클래스의 하위 목록 유형은 무엇입니까? – Beatles1692

+1

문제를 해결할 수 있습니까? 간단히 말해서 당신이 그것을 분류했다는 것은 도움이되지 않습니다. –

+0

나는 비슷한 문제에 직면 해 있으며 해결하지 못했습니다. 이 문제를 어떻게 해결했는지에 대해 자세히 설명해 주시겠습니까? 부디! – skrishna

답변

2

나는 비슷한 문제로 strugling하고 있습니다. 내 솔루션이 문제를 해결할 수 있는지 여부는 모르지만 ISession.Update 대신 ISession.Merge를 사용해보십시오.

+0

답장을 보내 주셔서 감사합니다! 세션 병합은 내 삭제 작업을 수행하는 것 같습니다. 그러나 다음과 같은 상황에서 자식 컬렉션을 먼저 지워야하는 경우 필요에 따라 작동하지 않습니다. 부모 .Children.Clear() '삽입 후 Parent.AddChild (child1); parent.AddChild (child2); session.Merge (parent); 나는 컬렉션을 지우는 데 필요한 초기 삭제가 아니라 삽입물입니다 ... 견과류를 몰아내는 것은 일반적인 요구 사항이어야합니다! –

+0

이상한 ... 내 경우에는 효과가 있었다. – maciejkow

+0

분류 - 감사합니다 백만! –

관련 문제