1

複合 ID を使用するデータ構造があります (これを単一に変更したくありません) 結合が空の場合、プロパティを null にマップする代わりに、空の結合にマップする多対 1 結合を除いて、すべて正常に読み込まれます。プロキシ オブジェクト。私は醜い回避策を書きました(以下を参照)。これに対する解決策はありますか?

プライベート ノード _Parent;

    public Node Parent
    {
        get
        {
            return this._Parent;
        }
        set
        {
            this._Parent = Proxy.Check<Node>(value);
        }
    }
internal static class Proxy
{
    public static T Check<T>(T obj) where T : PersistentObject
    {
        if (obj is NHibernate.Proxy.INHibernateProxy && obj != null)
        {
            try 
            {
                int id = obj.ID;
                return obj;             
            }
            catch //Proxy only object cant retrieve ID
            {
                return null;
            }
        }
        else
        {
            return obj;
        }
    }

}

マッピングファイルで始まる

<class name="Node" table="Node">
    <composite-id>
        <key-property name="ID"/>
        <key-property name="VersionID"/>
    </composite-id>

およびアクセス元

    <many-to-one name="Node" class="Node" >
        <column name="NodeID"/>
        <column name="VersionID" />
    </many-to-one>
4

1 に答える 1

2

これがこの状況の完全な修正であるかどうかは正確にはわかりませんが、複合キーを使用して古いDBで作業しているときに同じ問題が発生したときに、問題が修正されました。

リンクでnot-foundを無視するように設定することにより、NHibernateは空のオブジェクトを例外ではなくnullとして扱います。この手法を使用すると、NHibernateは個別のクエリを実行するため、基本的にオブジェクトの読み込みに熱心であるため、パフォーマンスがわずかに低下する可能性があります。

この手法を使用する代わりに、オブジェクトの読み込みを熱心に試すこともできますが、オブジェクト(nullではない)を予期しているため、例外が返されると思います。私は間違いなくこの分野の専門家ではないので、これがうまくいかない場合は、NHibernateフォーラムに質問を投稿することをお勧めしますが、これはあなたにとってより小さく/醜い回避策かもしれません。

例えば:

<many-to-one name="Node" class="Node" not-found="ignore">
    <column name="NodeID"/>
    <column name="VersionID" />
</many-to-one>

お役に立てれば、

ジェイ

于 2009-06-23T04:13:04.403 に答える