2 Stimmen

Zirkuläre Referenz, NHibernate und WCF

Dieses Problem geistert seit Jahren im Netz herum, ich habe noch keine gute Lösung gefunden. Das Thema ist die Übergabe einer Liste von Objekten, die eine zirkuläre Referenz in sich haben, die von NHibernate gefüllt wird (mit oder ohne Lazy Load - einige Seiten sagen, dass es mit Lazy nicht möglich ist)

Hier ist das Beispiel:

[DataContract]
class Person
{
   [DataMemeber]
   string Name
   [DateMember]
   IList<Child> myChilds;  
}

[DataContract]
class Child
{
   [DataMemeber]
   string Name
   [DateMember]
   Person Father   
}

Wenn ich versuche, alle Personen in meiner DB zu erhalten: Der Servercode wird sein:

ICriteria crit = session.CreateCriteria(typeof(Person)));
IList<Base> queryResult = crit.List<Base>();

Ich erhalte ein gutes Ergebnis auf der SERVER SIDE- eine Liste aller Personen, und innerhalb jeder Person erhalte ich eine Liste aller Söhne (und innerhalb jedes Sohnes - ich erhalte ein Objekt der Person, die innerhalb eine Liste seiner Söhne ect.... hat)

Der Versuch, diese Liste über WCF abzurufen, führt zu Fehlern im Kanal. (wenn ich die Person Objekt aus dem Kind zu entfernen - es funktioniert gut).

Lösungen, die ich ausprobiert habe, haben dieses Problem nicht gelöst: Hinzufügen von IsReference=true zu [DataContract] - hat nicht geholfen. Verschieben Sie alle die Zuordnung zu not.Lazyload() - hat nicht geholfen.

Irgendwelche Ideen, wie man dies lösen, ohne WCF neu zu schreiben?

Danke! Dani

2voto

Dani Punkte 13900

http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

Dieser Artikel löst das Problem.

EDIT :

Link ist offenbar schon seit einiger Zeit tot. Verwenden Sie die Wayback Machine, um die archivierte Version hier zu sehen: http://web.archive.org/web/20070219214621/http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

0voto

Shiraz Bhaiji Punkte 62129

Ihr Problem scheint die Größe der Antwort zu sein. WCF verfügt über eine Konfiguration für die Größe der zu sendenden Nachricht. Wenn Sie die Unterobjekte einbeziehen, überschreiten Sie das Limit.

0 Stimmen

Die Standardgröße von WCF ist 512K. Ich habe nur 5 "Person"-Objekte, und nur 1 von ihnen hat einen Sohn. Dies könnte ein Größenproblem sein - aufgrund der Endlosschleife der Serialisierung, aber die ursprüngliche Struktur, ist nicht mehr als ein paar K's....

0voto

Eugene Osovetsky Punkte 6302

IsReference ist in der Tat die offizielle Antwort, wenn Sie die Form des Objektgraphen tatsächlich erhalten wollen. Siehe http://msdn.microsoft.com/en-us/library/cc656708.aspx . Können Sie näher erläutern, was Sie mit "es hat nicht geholfen" meinen? Wo genau haben Sie IsReference eingefügt? Sowohl auf der Client- als auch auf der Serverseite? Welche Fehler haben Sie beobachtet?

Wenn Sie sich nicht um die Bewahrung der Referenz kümmern, gibt es verschiedene Lösungen, die eine Unterbrechung des unendlichen Referenzzyklus beinhalten. Die einfachste ist, das DataMember-Attribut von "Father" zu entfernen. Oder etwas mit einer "Schatteneigenschaft":

public Person Father;
[DataMember] public string FatherName
{ get {return Father.Name;} set {/* ... */ }}   

Es hängt wirklich stark von Ihren genauen Anforderungen ab...

0 Stimmen

Ich habe die IsReference auf das DataContract-Attribut, in dem verlinkten Artikel sagen sie, es sollte auf die problematische [DataMember] ABER... überraschend - [DataMember] weiß nicht über dieses Flag. dieser Code wird nicht kompilieren! (was sehr seltsam ist, da die Quelle des Beispiels MSDN ist...) Systme.RunTime.Serialization DataMemberAttribute enthält keine Definition für IsReference=true..... Ein Rätsel.

0 Stimmen

Hmm, ja, ich habe nicht bemerkt, dass das Thema kaputt war... Trotzdem: - Haben Sie IsReference sowohl auf Child- als auch auf Person-Typen angewendet? - Was ist genau passiert, als Sie IsReference ausprobiert haben? (Ausnahmen, etc.?)

0 Stimmen

Dieselbe Ausnahme - da sich nichts geändert hat. Die Ausnahme ist allgemein, nichts Spezifisches. Ich habe einen Artikel gelesen, der vorschlägt, zu einem anderen Serialisierer zu wechseln. Ich prüfe diese Option und werde hier Bericht erstatten. Ich habe jemanden bei Microsoft zu diesem Artikel befragt und warte noch auf eine Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X