2

Nhibernate で複合 ID のキーと多対 1 の関連付けをナビゲートすることは可能ですか?

次の設定でマップした (レガシー) テーブルがいくつかあります。

<class name="StructureUser">
    <composite-id>
        <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
        <key-many-to-one name="User" class="User" column="USERID" />
    </composite-id>
    ...
</class>

<class name="Structure">
    <id name="Id" column="id" type="Int32" >
        <generator class="native"/>
    </id>
    <property name="Low" column="low" type="Int32" />
    ...
</class>

クエリで StructureUser クラスを介して Structure の "Low" プロパティにアクセスしたいと考えています。考えられる Criteria API のすべての使用法を試しましたが、常にエラーが発生しました。私が試した2つのクエリは次のとおりです。

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
    .CreateAlias("Structure", "struc")
    .Add(Restrictions.Le("struc.Low", 123));

ICriteria crit2 = Session.CreateCriteria(typeof(StructureUser))
    .Add(Restrictions.Le("Structure.Low", 123));

crit1 のエラーはデータベースから発生し、"struc_1.Low はこのコンテキストでは有効ではありません" と表示されます。これは、NHibernate が sql コマンドの制限に必要な結合を生成しないためです。crit2 のエラーは NHibernate に由来し、StructureUser の「Structure.Low」プロパティにアクセスできないことを示しています。

この問題は、複合 ID を key-property 要素で宣言し、通常の多対 1 要素との関係を宣言することで回避しました。

この問題の別の解決策はありますか?

4

2 に答える 2

0

やってみました

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
    .CreateCriteria("Structure", "struc")
    .Add(Restrictions.Le("struc.Low", 123));
于 2009-11-12T10:27:46.140 に答える
0

同様の問題がありました。

元の投稿者が言ったように、エイリアスを作成する複合キーの要素に多対 1 の関係を追加する必要があり、プロパティ "insert" と "update" を "false" に設定する必要があります

次に、composite-id に保持できます。key-property 要素に変更する必要はありません。

<class name="StructureUser">
<composite-id>
    <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
    <key-many-to-one name="User" class="User" column="USERID" />
</composite-id>

<many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" insert="false" update="false" />

...

于 2014-06-03T20:10:06.280 に答える