質問

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

private Node _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>
役に立ちましたか?

解決

これがこの状況の完全な修正であるかどうかは正確にはわかりませんが、複合キーを使用して古い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>

これがお役に立てば幸いです

ジェイ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top