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 **中工作... –

相關問題