2010-12-14 7 views
0

私はAyendeの投稿hereに記載されているように、私のアプリケーションで継承のためのテーブルごとのサブクラス戦略を使用しています。サブテーブルIDのNhibernateテーブルごとの基準は、親テーブルのキー列を使用します

しかし、サブクラスを具体的に質問して、会社と言うと、私が知っている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クラスから派生しているので、ちょっと意味があります。しかし、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はを使用していた)、私は党のクラスで二回IDをマッピング:

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

「ID」がマッピングされていたので(ありませんIdとして)、どこの句を会社のIDに追加すると、NHibernateは混乱し、 "Id"のマッピングされた列としてキー列 "PartyId"を使用して、かなり混乱しました! Idの2番目のマッピングを削除して問題を解決しました。

とにかく、私の間違い!