Stoppen Sie das Laden oder Laden einer Eigenschaft in NHibernate? Der Proxy kann nicht über WCF serialisiert werden

8

Berücksichtigen Sie, dass ich übergeordnete, untergeordnete Beziehungsklassen und Zuordnungen habe. Ich verwende NHibernate, um das Objekt aus der Datenbank zu lesen und WCF zu verwenden, um das Objekt über die Leitung zu senden.

Ziel

  • Zum Lesen des übergeordneten Objekts möchte ich selektiv auf einem anderen Ausführungspfad entscheiden, wann ich das untergeordnete Objekt laden möchte. Weil ich nicht mehr lesen möchte, als ich brauchte.
  • Dieses teilweise geladene Objekt muss über WCF gesendet werden können. Wenn ich meine, dass ich es nicht lade, wird keine Seite auf diese Eigenschaft zugreifen.

Problem

  • Wenn ein solches teilweise geladenes Objekt über WCF gesendet wird, da diese Eigenschaft als [DataContract] markiert ist, kann sie nicht serialisiert werden, da es sich bei der Eigenschaft um einen Lazy-Load-Proxy anstelle eines real bekannten Typs handelt.

Was ich archivieren möchte oder eine Lösung, an die ich denken kann

  • lazy=false oder lazy=true funktioniert nicht. Der Ehemalige wird bereitwillig alle Beziehungen abrufen, letzterer wird einen Proxy erstellen. Aber ich möchte stattdessen nichts - ein null wäre das Beste.
  • Ich brauche keine faule Ladung. Ich hoffe, ein null für die Referenzen zu bekommen, die ich nicht holen will. Ein Nullwert, aber nicht nur ein Proxy. Dies macht WCF glücklich und verschwendet weniger Zeit, um einen Lazy-Load-Proxy zu erstellen.
    Wie könnte ich eine Null-Proxy-Fabrik haben? -ODER-
  • Oder WCF macht diese Eigenschaft zu ignorieren, die ein Proxy anstelle von real ist. Ich habe die IDataContractSurrogate-Lösung ausprobiert, aber nur die Eltern übergeben GetObjectToSerialize , ich beobachte nie, dass ein Proxy über GetObjectToSerialize übergeben wird, so dass keine Chance besteht, den Proxy zu deaktivieren.

Bearbeiten

Nach dem Lesen der Kommentare, mehr surfen im Internet ...

Es scheint mir, dass DTO den größten Teil der Berechnung auf die Serverseite verlagern würde. Aber für das Projekt, an dem ich arbeite, ist der Client in 50% der Fälle "intelligenter" als der Server, und der Server ist mehr wie ein Datenspeicher mit Validierung und Verifizierung. Obwohl ich zustimme, ist der Server nicht gerade dumm - ich muss entscheiden, wann ich die zusätzlichen Referenzen schon holen soll, und DTO wird dies sehr explizit machen.

Vielleicht sollte ich nur den Schmerz nehmen. Ich kannte Ссылка vorher nicht, das motiviert mich ein wenig mehr, um den Schmerz zu nehmen.

Auf der anderen Seite fand ich Ссылка , die mit IDataContractSurrogate.GetObjectToSerialize zu arbeiten scheint.

    
HelloSam 07.03.2010, 17:31
quelle

2 Antworten

2

Bei der WCF-Silverlight-Übertragung von DTO / Entitäten wurde dasselbe Problem angezeigt. Ich benutze folgenden Code, der gut funktioniert:

Flüssiger NHibernator:

%Vor%

XML:

%Vor%

Hoffe, das wird für dich funktionieren!

    
Andrey S 27.04.2011 10:51
quelle
1

Ich bin auf ähnliche Probleme mit der Leistung gestoßen. Stattdessen habe ich die gewünschten Informationen vorab geladen, indem ich einen expliziten Aufruf an die Datenbank mithilfe eines DetachedCriteria .

So wie du es tust, würde ich wahrscheinlich so etwas tun.

%Vor%

Dann würde ich von meiner Fassade jene Entitäten mit den Eigenschaften erhalten, die keine Null-Attribute auf der Kind-Eigenschaft haben

%Vor%

Dann hätte ich alle ParentClass-Entities, die eine Null-Eigenschaft haben.

Anstatt einen Treffer zu machen, indem ich die DB ständig nach Informationen frage, speichere ich sie im Speicher, damit sie für mich bereit ist.

Dies ist nur eine alternative Lösung für DTOs, viel Glück:)

    
Timbob 13.01.2011 17:31
quelle

Tags und Links