2010-04-18 8 views
1

필자는이 테이블 구조를 가지고 있으며 Fluent Hibernate (가능한 경우 하위 클래스)를 사용하여 매핑하려고합니다. 데이터베이스에 레코드가 너무 많아서 주요 응용 프로그램을 다시 작성할 수 있기 때문에 구조를 변경할 수 없습니다. Id from Party 테이블이 개인 및 조직 테이블의 외래 키인 경우 더 쉬울 것이지만, 특정 시나리오에서 데이터베이스는 파티 테이블의 외래 키로서 사람 및 조직 키를가집니다. 어떤 도움이라도 좋을 것입니다.Fluent NHibernate에서 일대일 관계를 어떻게 매핑 할 수 있습니까?

파티 테이블

아이디 는 OrganizationId

사람 테이블

아이디 FNAME LNAME

조직 테이블

아이디 ORGNAME 을 PersonIdOrgDescription

+0

참조 (x => x.Person, "PersonId") 참고. 참조 (x => x.Organization, "OrganizationId"). Not.Nullable(); 작동하지 않습니까? – jweyrich

답변

0

복합 ID를 구성하는 두 ID 이외의 필드가있는 경우 자동 매핑을 사용하여 연결 테이블을 매핑 할 수 없습니다. 귀하의 Party 테이블에는 잘 디자인되지 않았기 때문에 자동 매핑 규칙을 위반하는 Id 필드가 있습니다 (즉, 어디에서나 색인을 생성 할 수 있지만 복합 ID는 자동 증가 ID가 없어야합니다).

이 문제를 해결하려면 Party 용 ClassMap을 만들고 ID를 ID로 매핑하고 참조 인과 조직을 참조해야합니다.

그러면 개인 및 조직 엔티티에서 파티에 HasManyToMany 매핑을 생성하는 대신 파티 엔티티에 HasMany를 생성합니다.

실제로 오토 맵핑은 복합 기본 키만 포함하는 경우에만 링크 테이블을 통한 다 대다 관계를 암시하는 반면 명확하게 코드와 ERD를 유사하게 대조합니다.

3 일 동안 저를 곤란하게 만들었습니다.이 루트를 "해킹"으로 사용했습니다. 나중에 2 주 전 Fluent NHibernate의 Google 그룹에서이 설명을 읽었습니다.

나는 도움이 되었으면 좋겠어.

도 참조하십시오. my post about the same situation

편집 :

다음은 상당히 높은 수준입니다. 엔티티 생성자에서 콜렉션을 초기화하고 setter 메소드를 생성해야합니다. Getting Started

public class Party { 
    public virtual int Id { get; set; } 
    public virtual Person Person { get; set; } 
    public virtual Organization Organization { get; set; } 
} 
public class PartyMap : ClassMap<Party> { 
    public PartyMap() { 
     Id(x => x.Id); 
     References(x => x.Person); 
     References(x => x.Organization); 
    } 
} 
public class Person { 
    public virtual int Id { get; set; } 
    public virtual string FName { get; set; } 
    public virtual string LName { get; set; } 
    public virtual ICollection<Party> Parties { get; set; } 
} 
public class PersonMap : ClassMap<Person> { 
    public PersonMap() { 
     Id(x => x.Id); 
     Map(x => x.FName); 
     Map(x => x.LName); 
     HasMany(x => x.Parties); 
    } 
} 
public class Organization { 
    public virtual int Id { get; set; } 
    public virtual string OrgName { get; set; } 
    public virtual string OrgDescription { get; set; } 
    public virtual ICollection<Party> Parties { get; set; } 
} 
public class OrganizationMap : ClassMap<Organization> { 
    public OrganizationMap() { 
     Id(x => x.Id); 
     Map(x => x.OrgName); 
     Map(x => x.OrgDescription); 
     HasMany(x => x.Parties); 
    } 
} 
+0

짐 감사합니다. 그 파티 테이블을 보면서 그 파티 테이블이 링크 테이블이라는 사실을 알지 못했다. 그 테이블의 자동 증가 ID는 나를 쫓아 버렸다. 문제는 Party 테이블의 데이터가 PersonId 또는 OrganizationId를 가질 수있는 위치에 제약이 있으므로 일대일 관계로 매핑하려고하기 때문에이 문제를 놓친 사람은 누구나 동의합니다. 나는 NHibernate에 익숙하지 않다. 당신이 약간의 코드를 제공한다면 나는 매우 행복 할 것이다. 대단히 감사합니다. Rusty –

+0

@Rusty : 나는 예상했던 것보다 최근에 훨씬 바빴다. 따라서이 코드를 작성하고 올바른 방향으로 지적 할 수있게되기를 바랍니다. 나는 (파티 클래스를위한 컨벤션을 사용하여, 아마도 이것을 사용하는 다른 방법이있을 것이라고 확신한다.) 그러나 이것은 나의 연결 테이블 모두가 감사 필드, 노트 필드 및 다른 임의의 쓰레기를 가지고 있기 때문에 이것은 나를위한 가장 쉬운 방법이었다. 두 테이블을 서로 연결하는 것뿐입니다. –