2017-04-09 6 views
0

Hier ist mein CodeNhibernate inkonsistent fetching Verhalten

if (des.X == null) 
{ 
    if (src.IsL) 
    { 
     des.X = new Y(); 
     var l = lRepo.Find().Where(file => file.Id == src.drId).First(); 
     ((Y)des.X).L = l; 
    } 
    else 
    { 

     D d = dRepo.Get(src.DrugId); 
     if (d is N) 
     { 
      des.X = new Y(); 
      ((Y)des.X).D = d; 
      ((Y)des.X).L = ((N)d).L; 
     } 
     else 
     if (d is IF) 
     { 
      des.X = new IeI(); 
      des.X.D = d; 
     } 
    } 
} 

das Problem tritt auf, wenn ich if (d is N)

Beim ersten Mal fragen, wenn ich eine Anfrage erstellen senden und ich sende einen N Id, werten Es ist wahr, aber wenn ich dieselben Daten für das Update sende, wertet es es als falsch aus.

Ich bin ein wenig verwirrt und ich habe keine logische Erklärung dafür, also könnte mir jemand helfen, dieses Problem zu lösen.

Bei der Aktualisierung wird ein Proxy zurückgegeben, aber beim Erstellen wird eine normale Entität zurückgegeben.

Entgraten und nicht Lazy Load-Lösungen funktionieren in diesem Fall, aber ich denke nicht, dass sie effiziente Lösungen sind.

Jede Hilfe bitte.

Antwort

1

Sie erhalten wahrscheinlich einen Proxy einer zugeordneten Basisklasse. Es stammt von der Basisklasse, nicht von Ihrer konkreten Klasse, was dazu führt, dass Ihr Typprüfung fehlschlägt.

Ohne weitere Details zu Ihrem Modell kann ich nur eine Worst-Case-Lösung vorschlagen. (. Es wäre besser zu sein in einer Situation zu vermeiden, in denen Sie mit dem Testen der Art der Basisklasse Proxies gegen erwartete konkrete Typen zu tun haben)

in Ihrer Basisklasse, fügen Sie diese:

public virtual Type GetUnproxiedType() 
{ 
    return GetType(); 
} 

ändern Ihren Test:

if (typeof(NonInfantDrugRegistration).IsAssignableFrom(
    drugRegistration.GetUnproxiedType())) 

Dies sollte funktionieren, weil ein NHibernate Proxy-Aufrufe von Methoden und Eigenschaften umleitet, ausgenommen die ID und Methoden zum Objekttyp angehören (und einige andere). Es leitet Aufrufe an eine konkrete nicht-verwaltete Instanz um, die beim ersten Aufruf zum Umleiten dynamisch erstellt und geladen wird. Diese konkrete Instanz ist kein Proxy und hat den erwarteten Typ. Daher wird die obige Methode GetUnproxiedType zu einem unverpackten NonInfantDrugRegistration umgeleitet, der dann Ihren konkreten Typ zurückgibt.