2

VS2015 の .net 4.5 ターゲット プロジェクトで NuGet の NHibernate 3.3.1.4000 を使用しています。

最初のenv1 は VS2012 とVS2015の Windows 8.1 で、2 つは Windows 10 と VS2015 のみの env2 です。

QueryOver docsに記載されているように、エイリアスは次のようになります。

QueryOver では、エイリアスは空の変数を使用して割り当てられます。変数はどこでも宣言できます (ただし、実行時には null にする必要があります)。コンパイラは、変数が正しく使用されていることに対して構文をチェックできますが、実行時に変数は評価されません (エイリアスのプレースホルダーとして使用されるだけです)。

QueryOver の各 Lambda 式関数には、エイリアスを使用できる対応するオーバーロードと、サブ QueryOver を作成せずにエイリアスを使用して関連付けをトラバースする .JoinAlias 関数があります。

したがって、これは、null 値を持つプライベート フィールドがエイリアスとして正常に機能することを意味します。

しかし...そう簡単ではありません。

次の例があります。

    public void Test()
    {
        TestDto testDtoAlias = null;

        var users = GetSession()
            .QueryOver(() => _userAlias)
            .SelectList(list => list
                .Select(() => _userAlias.Id).WithAlias(() => testDtoAlias.UserId)
            )
            .TransformUsing(Transformers.AliasToBean<TestDto>())
            .List<TestDto>();
    }

    private class TestDto
    {
        public long UserId { get; set; }
    }

    private readonly User _userAlias = null;

これはenv1で問題なく動作しますが、例外がスローされます:

NHibernate.QueryException: could not resolve property: &lt;&gt;4__this._userAlias.Id of: User

env2で。

AleasToBean なしで Id のリストを選択した場合に注意してください。

var users = GetSession()
            .QueryOver(() => _userAlias)
            .SelectList(list => list
                .Select(() => _userAlias.Id)
            )
            .List<long>();

両方の環境で期待どおりに動作します。

env2で何が問題を引き起こしているのかについて何か考えはありますか?

回避策は簡単です。メソッドと同じスコープでエイリアスを作成するだけですが、例が正しいように見えるので、構成に何が欠けているのか知りたいです。:(

4

2 に答える 2

2

それで、一生懸命検索した後、答えを見つけました。NHibernate は"Roslyn" コンパイラと競合していましたが、次のバージョン4.0.4、3.4.1、および 3.3.5 で修正されました。NHibernate をこのバージョンのいずれかに更新するだけで、問題が解決しました。

于 2016-05-19T16:52:42.013 に答える
1

この回答を参照してください https://stackoverflow.com/a/6894010/246811

ドキュメントは少し曖昧かもしれませんが、メソッドまたはブロックにスコープされた変数を意味すると思います。

ローカル変数を使用するだけです。

于 2016-05-16T22:48:27.077 に答える