2008-11-14 2 views
4

NHibernate에서 'one'측의 객체가 열에 대해 고유 제한 조건을 갖는 다 대일 관계를 모델링하는 데 문제가 있습니다. 문제는 다음과 같습니다.NHibernate 다 대일 및 고유 제한 조건 위반

두 개의 테이블 인 '사람'과 '국가'가 있습니다. 각 개인은 하나의 유일한 국가를 가지고 있습니다. 한 국가는 많은 인물 (정말로! :)을 가질 수 있으며 국가 이름은 고유합니다. 국가 측면에서

<many-to-one Name="Country"> 
<column Name="CountryId"/> 
</many-to-one> 

:

<property name="Name" unique="true"> 
<column name="Name" length="50"> 
</property> 

지금 데이터베이스에 나는 국가 테이블의 이름 열에 고유 제한 조건을 추가 한 인격 측의 매핑이되어 다음과 같습니다. Person 인스턴스에 Save()를 호출하면 NHibernate는 INSERTS를 수행하려고하는데 Country Name이 존재하는지 확인하고 Person 테이블의 CountryID 열에 ID를 사용합니다. 대신 데이터베이스의 고유 제한 조건을 위반하여 발생하는 예외가 발생합니다.

나는 Nibernate가 옳은 일을하기에 충분한 매핑 메타 데이터를 가져야 만한다 (또는이 속성을 보장하지 않는 속성의 고유 속성은?). 누구든지이 작업을 수행하거나 해결 방법을 알고 있습니까?

감사합니다,

마티

답변

6

당신은 (단지 ID를 설정되지 않음) 사람 인스턴스의 국가 재산 국가 인스턴스를 할당해야합니다. 뭔가 같은 :

Person p = new Person(); 
p.Country = session.Load<Country>(countryId); 
session.Save(p); 

그러면 NHibernate는 무엇을 해야할지 알 것입니다. Load 메서드가 Country 프록시를 반환하고 사용자가 액세스하는 유일한 인스턴스가 Country 인스턴스의 ID이기 때문에 DB 히트가 국가를 검색하지 않습니다.

0

비슷한 요구 사항이있어서 SaveOrUpdateCopy을 사용하여 해결했습니다.

두 개의 서로 다른 People 객체가 있고 각 객체마다 다른 Country 객체에 대한 참조가 있다고 가정 해 보겠습니다. 국가 ID가 인 경우 예외는 없으며 데이터베이스는 1 개 국가에만 있습니다.

유일한 방법은 SaveOrUpdateCopy를 호출하기 전에 Country 개체에 ID를 지정해야한다는 것입니다.

관련 문제