2010-12-14 1 views
0

Ayende의 게시물 here에 설명 된대로 내 응용 프로그램에서 상속을위한 테이블 당 하위 클래스 전략을 사용합니다.서브 클래스 ID에 대한 Nhibernate table-per-class 기준은 부모 테이블의 키 열을 사용합니다.

그러나 하위 클래스를 구체적으로 쿼리 할 때 회사를 말하고 Id (내가 알고있는)에서 필터링하면 결과 SQL이 잘못되어 SQL Server에서 오류가 발생합니다. 기준 :

session.CreateCriteria<Company>() 
    .Add(Expression.Eq("Id", 25) 
    .List<Company>(); 

결과 생성 된 SQL :

SELECT this_.PartyId, 
     this_.CompanyName 
FROM Companies this_ 
     inner join Parties this_1_ 
      on this_PartyId = this_1_.Id 
WHERE this_1_.PartyId = 25 

문제는 (마지막 줄 - PartyId가 당사국 테이블에 정의되지 않음) 자식 테이블의 키 열에서 사용되는 것입니다 부모 테이블 "Id"는 C#의 Party 클래스에서 파생되므로 다소 이해가갑니다. 그러나 파티 매핑에 정의 된 Id "Id"대신 "PartyId"키 열을 사용하는 이유는 무엇입니까? 어떻게 작동시킬 수 있습니까?

감사합니다.

편집 : 질문으로, 여기에 (블로그 게시물에있는 것과 같은) 매핑이

<class name="Party" 
    abstract="true" 
    table="Parties"> 
<id name="Id"> 
    <generator class="identity"/> 
</id> 

<joined-subclass 
    table="People" 
    name="Person"> 
    <key column="PartyId"/> 
    <property name="FirstName"/> 
</joined-subclass> 

<joined-subclass 
    table="Companies" 
    name="Company"> 
    <key column="PartyId"/> 
    <property name="CompanyName"/> 
</joined-subclass> 

+0

파티 매핑을 게시 할 수 있습니까? – Rippo

답변

0

나는 마침내 문제를 발견합니다. 나는 (내가 나에게 매핑 위에서 볼을주고 유창함 자 NHibernate를 사용했다) 매핑에서 실수를했고 나는 파티 클래스에 두 번 이드 매핑 :

public class PartyMap : ClassMap<Party> 
{ 
    public PartyMap() 
    { 
     Table("Parties"); 
     Id(p => p.Id).GeneratedBy.Assigned(); 
     Map(p => p.Id); 
    } 
} 

"이드"(안 매핑 된 이후 Id로서), Where 절을 회사의 ID에 추가 할 때, NHibernate는 "Id"의 매핑 된 열로 "PartyId"키 열을 혼동하고 혼란스러워했다. Id에 대한 두 번째 매핑을 제거하면 문제가 해결되었습니다.

어쨌든, 내 실수!

관련 문제