NHibernate의 역 속성


89

역 속성은 어떻게 사용합니까? 내가 착각하지 않았다면 일대 다 관계의 경우 역 속성을 true로 설정해야합니다. 다 대다 관계의 경우 엔터티 클래스 역 속성 중 하나는 true로 설정하고 다른 하나는 false로 설정해야합니다.

누구든지 이것에 약간의 빛을 비출 수 있습니까?


2
비슷한 질문에 대한 내 대답 " When to use inverse ="true | false " "를 확인할 수도 있습니다 .
Daniel Schilling

답변:


126

역 속성은 true로 설정되지 않아야합니다.

inverse 속성을 사용하여 연관의 '소유자'를 지정합니다. (연결에는 소유자가 하나만있을 수 있으므로 한쪽 끝은 역으로 설정하고 다른 쪽 끝은 '비 역'으로 설정해야합니다.) (소유자 : inverse=false; 비 소유자 : inverse=true)

일대 다 연결에서 컬렉션을 역 끝으로 표시하지 않으면 NHibernate가 추가 UPDATE를 수행합니다. 실제로이 경우 NHibernate는 컬렉션에 포함 된 엔티티를 먼저 삽입하고, 필요한 경우 컬렉션을 소유 한 엔티티를 삽입 한 후 '컬렉션 엔티티'를 업데이트하여 외래 키가 설정되고 연결됩니다. 만들어집니다. (이것은 또한 DB의 외래 키가 null을 허용해야 함을 의미합니다).

컬렉션 끝을 'inverse'로 표시하면 NHibernate는 먼저 컬렉션을 '소유'하는 엔티티를 유지하고 나중에 컬렉션에있는 엔티티를 유지하여 추가 UPDATE 문을 피합니다.

따라서 양방향 연결에서는 항상 하나의 반대 끝이 있습니다.


4
이 단지 추가 소유자에게 모든 것을 설명하는 것은 테이블의 외래 키를 가지고 하나입니다
Brijesh 슈라

48
제 생각에는 이것은 정말 나쁜 용어입니다. 왜 '반대'가 아닌 소유권을 표시하지 않습니까?!
UpTheCreek

1
이미 부정 된 용어에 부정을 사용하는 경우 +1 :) "INVERSE 속성은 true로 설정하면 안됩니다."
contactmatt

좋은 대답은, 남아있는 유일한 문제는 사람들이 "소유자"해야 결정하는 방법입니다
PandaWood

두 개체 간의 관계를 유지하는 중간 테이블이있는 경우 다대다는 어떻습니까?
Dark_Knight 2018

10

위의 답변 외에도 내 이해에 따라 외래 키 값을 컬렉션에 수동으로 유지해야합니다. 즉, 추가 업데이트 문을 원하지 않는 경우 :

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);

역 속성에 대한 자세한 설명은 다음 게시물을 확인하십시오.

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/


2

"소유자"가 어디로 들어오는 지 알 수 있지만 연관은 파이프이고 양쪽 끝을 아래로 볼 수 있으므로 어떤 엔티티가 파이프를 "소유"하는지 말할 수 있습니다.

이것을 보는 다른 방법은 일대 다 관계에서 실제로 2 개의 관계가 진행되고 있다는 것입니다.

관계 1 : 부모와 많은 자녀.

관계 2 : 각 자녀와 부모

따라서 NH는 DB에 이들 각각을 저장하기 위해 SQL을 실행하려고 시도합니다. 하지만 외래 키를 설정할 때 예를 들어 관계 2에서 자식이 저장 될 때 부모와 자식의 관계도 자동으로 고정 되었기 때문입니다. 관계 1은 관계 2의 "역"이기 때문입니다. .

따라서 역은 기본 관계를 설정하면 기본적으로 얻는 것을 의미합니다. 즉, NH가 관계 1을 수정하기 위해 sql을 실행할 필요가 없으며 자식 컬렉션을 Inverse NH로 표시하면 자식 컬렉션이 추가 될 때 SQL 실행을 건너 뜁니다.

나는 NH에게 그것이 역이라고 말하지 않으면 역 관계를 시도하고 설정하기 위해 SQL을 수행하는 데 노력을 낭비 할 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.