2

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

我有两个环境,第一个env1是带有 VS2012 和 VS2015 的 windows 8.1,第二个是带有 windows 10 且只有 VS2015 的 env2

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

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

QueryOver 中的每个 Lambda 表达式函数都有一个相应的重载以允许使用别名,以及一个 .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问题的任何想法?

工作很简单,只需在与方法相同的范围内创建别名,但我想知道我在配置中缺少什么,因为示例看起来是正确的。:(

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 回答