2

Ich benutze die NHibernate 3.3.1.4000 von NuGet in .net 4.5 gezielte Projekt in VS2015.NHibernate AliasToBean Transformator wirft dann die QueryOver Alias ​​ist ein privates Feld

Ich habe zwei Umgebungen erste ENV1 ein Windows 8.1 mit VS2012 und VS2015, und zweiten env2 mit Fenstern 10 und nur VS2015.

Wie in QueryOver docs angegeben wird, könnte Aliase sein:

In QueryOver, Aliase zugewiesen eine leere Variable. Die Variable kann an beliebiger Stelle deklariert werden (sollte aber zur Laufzeit null sein). Der Compiler kann dann überprüfen, ob die Syntax für die Variable korrekt verwendet wird, aber zur Laufzeit wird die Variable nicht ausgewertet (sie wird nur als Platzhalter für den Alias ​​verwendet).

Jede Lambda-Expression-Funktion in QueryOver hat eine entsprechende Überladung, um die Verwendung von Aliasen zu ermöglichen, und eine .JoinAlias-Funktion, um Assoziationen mit Aliasen zu durchlaufen, ohne einen Sub-QueryOver zu erstellen.

Das bedeutet also, das private Feld mit einem Nullwert sollte als Alias ​​funktionieren.

ABER ... ist nicht so einfach.

Ich habe nächstes Beispiel:

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; 

, die auf Ums1 funktioniert gut aber werfen Ausnahme:

NHibernate.QueryException: could not resolve property: &lt;&gt;4__this._userAlias.Id of: User 

auf enV2.

Hinweis, wenn ich wählen Sie die Liste von Ids ohne AleasToBean:

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

es auf beiden Umgebungen wie erwartet funktioniert.

Irgendwelche Gedanken dazu, was das Problem auf der env2 verursachen könnte?

Das Workaround ist einfach, erstellen Sie einfach die Aliases im selben Bereich wie die Methode, aber ich möchte wissen, was fehlt mir in der Konfiguration, da das Beispiel es richtig scheint. :(

Antwort

0

Sehen Sie diese Antwort https://stackoverflow.com/a/6894010/246811

Die Dokumentation ein wenig vage sein kann, aber ich glaube, es bedeutet Variablen, die sich auf ein Verfahren oder Block scoped werden.

Nur lokale Variablen verwenden.

+0

Danke, ich habe diese Antwort gesehen ... aber ich frage mich, warum es in ** env1 ** funktioniert hat ... –