0

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>

4

1 に答える 1

0

私はついに問題を見つけました。マッピングを間違えたため(上記のマッピングを提供するためにFluent NHibernateを使用していました)、PartyクラスのIDを2回マッピングしました。

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

「Id」は(Idとしてではなく)マップされているため、会社のIdにwhere句を追加すると、NHibernateは混乱し、キー列「PartyId」を「Id」のマップ列として使用しました。これは非常に混乱します。Idの2番目のマッピングを削除すると、問題が解決しました。

とにかく、私の間違い!

于 2010-12-15T13:02:55.550 に答える