3

FKが常に使用されるとは限らないレガシーデータベースを使用しています。たとえば、エンティティPersonとエンティティCountryがあります。人には、人のマッピングで多対1としてマップされる国があります。

<many-to-one name="Country" class="Country" foreign-key="none" lazy="false" not-found="ignore" fetch="join" outer-join="true" column="countryid"/>

人がnull列値(countryid)として持っている場合、追加の選択クエリは実行されません(countryテーブルに参照がないことがわかっているため)が、人が0列値として持っている場合、NHは別のselectを実行します。国が実際に存在しないかどうかの国の表を確認してください。しかし、左外部結合を行うため、NHはそれが存在しないことをすでに知っているはずです。明確にするために、列に値が1あり、それが国のテーブルに存在する場合、追加の選択は実行されません。

とにかく、NHibernateに余分な選択クエリを実行しないように指示することはできますか?

ありがとう

4

1 に答える 1

4

いいえ、設定でこれを行う方法はありません。機能を改善するための素敵な投稿not-found="ignore"

http://nhforge.org/blogs/nhibernate/archive/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.aspx

custom のような NHibernate 拡張ポイントのいくつかを使用できますPocoEntityTuplizerが、単純な構成や設定はありません...

一部の抜粋: 上記のリンクから(詳細については、リンクを参照してください)Personエンティティのビルド プロセス中に、コレクションobject[] valuesには も含まれますCountryProxy。DB に欠落しているものは Id == 0 のものであるとしましょう (必要に応じて独自のロジックを使用してください)。このプロキシは次のように置き換えられるnullため、SELECT は実行されません...

public class NullableTuplizer : PocoEntityTuplizer
{
    public override void SetPropertyValues(object entity, object[] values)
    {
        for (int i = 0; i < values.Length; i++)
        {
            if (typeof (Country).IsAssignableFrom(getters[i ].ReturnType)
                && ((Country) values[i]).Id == 0) // missing id 
            {
                values[i] = null; // here change a Proxy to null
            }
        }
        base.SetPropertyValues(entity, values);
    }
...
于 2012-12-05T18:22:23.390 に答える