2

我在VS2015的.net 4.5目标项目的NuGet中使用NHibernate 3.3.1.4000。NHibernate AliasToBean变压器抛出然后QueryOver别名是一个私人字段

我有两个环境中,第一ENV1一个视窗8.1 VS2012和VS2015, 和第二个ENV2与窗10和仅VS2015。

正如在QueryOver docs指出,别名可以是:

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

QueryOver中的每个Lambda表达式函数都有一个对应的重载,以允许使用别名,并且.JoinAlias函数可以使用别名遍历关联而不创建子查询。

所以这意味着具有空值的专用字段应该很好地作为别名工作。

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

我有下面的例子:

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

注意如果我选择的ID列表不AleasToBean:

var users = GetSession() 
      .QueryOver(() => _userAlias) 
      .SelectList(list => list 
       .Select(() => _userAlias.Id) 
      ) 
      .List<long>(); 

它适用于这两种环境如预期。

想什么可能会导致问题在env2

workarroud很容易,只是在与方法相同的作用域上创建别名,但我想知道我在配置中缺少什么,因为它看起来正确。 :(

回答

0

看到这个答案https://stackoverflow.com/a/6894010/246811

的文档可能会有点模糊,但我相信这意味着程序属于一个方法或块变量。

只需使用局部变量。

+0

谢谢,我看到了答案......但我想知道为什么它在** env1 **中工作... –

相关问题