Ayendeの投稿で説明されているように、アプリケーションの継承にはサブクラスごとのテーブル戦略を使用しています。
ただし、特にCompanyなどのサブクラスをクエリし、ID(私が知っている)でフィルタリングしている場合、結果のSQLは正しくなく、SQLServerでエラーが発生します。基準:
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がPartiesテーブルで定義されていない)は、子テーブルのキー列が親テーブルで使用されていることです。「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>