我在 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: <>4__this._userAlias.Id of: User
在env2上。
请注意,如果我选择没有 AleasToBean 的 Id 列表:
var users = GetSession()
.QueryOver(() => _userAlias)
.SelectList(list => list
.Select(() => _userAlias.Id)
)
.List<long>();
它在两种环境中都按预期工作。
关于可能导致env2问题的任何想法?
工作很简单,只需在与方法相同的范围内创建别名,但我想知道我在配置中缺少什么,因为示例看起来是正确的。:(