NHibernate AliasToBean 转换器抛出 QueryOver 别名是私有字段
NHibernate AliasToBean transformer throws then the QueryOver alias is a private field
我在 VS2015 的 .net 4.5 目标项目中使用来自 NuGet 的 NHibernate 3.3.1.4000。
我有两个环境,第一个是 env1 一个 windows 8.1 with VS2012 和 VS2015,
第二个 env2 windows 10 并且只有 VS2015.
如 QueryOver docs 中所述,别名可以是:
In QueryOver, aliases are assigned using an empty variable. The variable can be declared anywhere (but should be null at runtime). The compiler can then check the syntax against the variable is used correctly, but at runtime the variable is not evaluated (it's just used as a placeholder for the alias).
Each Lambda Expression function in QueryOver has a corresponding overload to allow use of aliases, and a .JoinAlias function to traverse associations using aliases without creating a sub-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.
注意 如果我 select 没有 AleasToBean 的 ID 列表:
var users = GetSession()
.QueryOver(() => _userAlias)
.SelectList(list => list
.Select(() => _userAlias.Id)
)
.List<long>();
它在两种环境下都按预期工作。
关于 env2 上可能导致问题的任何想法?
workarroud 很简单,只需在与该方法相同的范围内创建别名,但我想知道我在配置中遗漏了什么,因为这个例子看起来是正确的。 :(
查看此回答
文档可能有点含糊,但我相信它的意思是范围限定在方法或块中的变量。
只使用局部变量。
经过一番苦苦搜索,我找到了答案。
NHibernate 有一些 conflicts with "Roslyn" compiler, but they fixed them in next versions 4.0.4, 3.4.1, and 3.3.5。
只需将 NHibernate 更新到这个版本之一,就解决了我的问题。
我在 VS2015 的 .net 4.5 目标项目中使用来自 NuGet 的 NHibernate 3.3.1.4000。
我有两个环境,第一个是 env1 一个 windows 8.1 with VS2012 和 VS2015, 第二个 env2 windows 10 并且只有 VS2015.
如 QueryOver docs 中所述,别名可以是:
In QueryOver, aliases are assigned using an empty variable. The variable can be declared anywhere (but should be null at runtime). The compiler can then check the syntax against the variable is used correctly, but at runtime the variable is not evaluated (it's just used as a placeholder for the alias).
Each Lambda Expression function in QueryOver has a corresponding overload to allow use of aliases, and a .JoinAlias function to traverse associations using aliases without creating a sub-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.
注意 如果我 select 没有 AleasToBean 的 ID 列表:
var users = GetSession()
.QueryOver(() => _userAlias)
.SelectList(list => list
.Select(() => _userAlias.Id)
)
.List<long>();
它在两种环境下都按预期工作。
关于 env2 上可能导致问题的任何想法?
workarroud 很简单,只需在与该方法相同的范围内创建别名,但我想知道我在配置中遗漏了什么,因为这个例子看起来是正确的。 :(
查看此回答
文档可能有点含糊,但我相信它的意思是范围限定在方法或块中的变量。
只使用局部变量。
经过一番苦苦搜索,我找到了答案。 NHibernate 有一些 conflicts with "Roslyn" compiler, but they fixed them in next versions 4.0.4, 3.4.1, and 3.3.5。 只需将 NHibernate 更新到这个版本之一,就解决了我的问题。