NHibernate AliasToBean转换器抛出,然后QueryOver别名是私有字段

时间:2016-05-16 19:22:41

标签: c# nhibernate visual-studio-2015 queryover resulttransformer

我在VS2015的.net 4.5目标项目中使用NuGet的NHibernate 3.3.1.4000。

我有两个环境,首先是 env1 带有VS2012和VS2015的Windows 8.1, 第二个 env2 与Windows 10和VS2015。

正如QueryOver docs中所述,别名可能是:

  

在QueryOver中,使用空变量分配别名。变量可以在任何地方声明(但在运行时应该为null)。然后,编译器可以检查针对变量的语法是否正确使用,但是在运行时,不会评估变量(它只是用作别名的占位符)。

     

QueryOver中的每个Lambda Expression函数都有一个允许使用别名的相应重载,以及一个.JoinAlias函数来使用别名遍历关联而不创建子QueryOver。

所以这意味着具有空值的私有字段应该可以作为别名使用。

但......不是那么容易。

我有下一个例子:

    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 可能导致问题的原因的任何想法?

workarroud很简单,只需在与方法相同的范围内创建别名,但我想知道配置中缺少什么,因为这个例子似乎是正确的。 :(

2 个答案:

答案 0 :(得分:2)

经过一番艰苦的搜索后,我找到了答案。 NHibernate有一些conflicts with "Roslyn" compiler,但他们在下一个版本4.0.4, 3.4.1, and 3.3.5中修复了它们。 只是将NHibernate更新为此版本之一,解决了我的问题。

答案 1 :(得分:0)

请参阅此回答https://stackoverflow.com/a/6894010/246811

文档可能有点模糊,但我认为它意味着范围为方法或块的变量。

只需使用局部变量。