2

자식 클래스의 두 목록이있는 부모 클래스Nhibernate에 많은 삽입이 추가 업데이트를 생성합니다 (반전 없음)

 public class Parent 
    { 
     ... 

     public virtual ICollection<Foo> Foo{ get; set; } 

     public virtual ICollection<Bae> Bar{ get; set; } 
    } 

    public class Foo 
    { 
     ... 

     public virtual Parent Parent{ get; set; } 
    } 

    public class Bar 
    { 
     ... 

     public virtual Parent Parent{ get; set; } 
    } 

매핑은

부모 개체를 저장할 때마다

INSERT Parent ... 
INSERT Foo with Parent_id set to NULL 
INSERT Bar with Parent_id set to NULL 
UPDATE Foo set Parent_id to Parent id 
UPDATE Bar set Parent_id to Parent id 

에서 관계를 Inverse로 설정하면 추가 업데이트를 피할 수 있습니까?

답변

9

양방향 인증을 사용하는 경우 은 역방향으로 설정하면 가장 일반적인 방법입니다.

또 다른 가능성은 부모 참조를 Not.Insert().Not.Update()으로 설정하면 부모 속성이 삽입/업데이트에 대해 완전히 무시됩니다.

하위에서 상위로의 참조가 필요하지 않은 경우 클래스 및 매핑에서 제거하여 컬렉션 만 갖도록하십시오.

두 번째 및 세 번째 방법으로 HasMany에 Not.KeyNullable()을 추가로 설정할 수 있습니다. 이는 NHibernate가 상위 ID가 이미 설정된 새 행을 삽입하고 추가 업데이트 문 (이 기능은 NHibernate 3.2.0이 필요함)을 방지합니다.

+0

부모를 저장하기 위해 어린이를 저장하는 것은 의미가 없습니다. 특히 두 개의 다른 자식 객체가있을 때 특히 그렇습니다. 내가 원하는 것은'session.Save (parent)'를 호출하고 전체 트리를 저장하는 것입니다. –

+0

@Circadian, 그게 바로 당신을 위해 inverse가 달성 할 것입니다. 부모를 구할 아이가 필요하지 않습니다. –

+0

@Circadian 당신은 이미'Cascade.All()'을 가지고 있습니다. 그러면 자식들에게'Save()'를 호출 할 필요가 없습니다. 이것은 내가 반대의 독립 또는 내가 제안한 다른 방법이다. – cremor

1

AFAIK 아니요. inverse 속성을 설정하여 연결의 소유자를 지정합니다.

역 특성을 지정하는 것이 왜 문제입니까?

+0

협회의 소유자는 부모입니다. 아이들 중 한 명이 그것을 통제하게하는 것이 비이성적 인 것처럼 보입니다. –

+0

inverse 특성을 지정하면 부모가 소유자라고 말할 수 있습니다. –

+0

'HasMany'에 inverse를 지정하면 자녀 중 하나에게 소유권을 부여합니다. 또는 그렇게 생각합니다. 'References'에서 저는 inverse를 지정할 수 없습니다. –