我在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: <>4__this._userAlias.Id of: User
env2 。
注意如果我选择没有AleasToBean的ID列表:
var users = GetSession()
.QueryOver(() => _userAlias)
.SelectList(list => list
.Select(() => _userAlias.Id)
)
.List<long>();
它在两种环境下均可正常工作。
有关 env2 可能导致问题的原因的任何想法?
workarroud很简单,只需在与方法相同的范围内创建别名,但我想知道配置中缺少什么,因为这个例子似乎是正确的。 :(
答案 0 :(得分:2)
经过一番艰苦的搜索后,我找到了答案。 NHibernate有一些conflicts with "Roslyn" compiler,但他们在下一个版本4.0.4, 3.4.1, and 3.3.5中修复了它们。 只是将NHibernate更新为此版本之一,解决了我的问题。
答案 1 :(得分:0)