2009-10-13 11 views
2

Ce problème apparaît autour du réseau depuis des années, je n'ai pas encore trouvé de bonne solution. Le sujet passe une liste d'objets qui ont référence circulaire à l'intérieur les peuplées par NHibernate (avec ou sans charge paresseux - certains sites SAIS il ne peut pas être fait avec paresseux)Référence circulaire, NHibernate et WCF

Voici l'exemple:

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

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

Lorsque je tente d'obtenir toutes les personnes dans mon DB: le code serveur sera:

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

-je obtenir un bon résultat sur le serveur Side- une liste de toutes les personnes, et à l'intérieur chaque personne Je reçois une liste de tous les fils (et à l'intérieur de chaque fils - je reçois un objet de la personne qui a à l'intérieur une liste de ses fils ect ....)

Maintenant, essayant d'obtenir cette liste sur WCF fautes le canal. (si je supprime l'objet Person de l'enfant - cela fonctionne bien).

Solutions J'ai essayé et n'ai pas résolu ce problème: Ajout de IsReference = true à [DataContract] - n'a pas aidé. Déplacer tout le mappage à not.Lazyload() - n'a pas aidé.

Toutes les idées comment résoudre ceci sans réécrire WCF?

Merci, Dani

Répondre

2

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

Cet article résout le problème.

EDIT:

Lien a apparemment mort depuis un certain temps. Utilisez le Wayback Machine pour voir la version archivée de celui-ci ici: http://web.archive.org/web/20070219214621/http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

+0

Le lien est cassé pour le moment. – Restuta

+0

Lien est toujours disparu - 404. – ssmith

0

Il semble que votre problème est la taille de la réponse. WCF a la configuration pour la taille du message à envoyer. Lorsque vous incluez les sous-objets, vous dépasserez la limite.

+0

la taille par défaut de WCF est 512K. Je n'ai que 5 objets "Personne", et seulement 1 d'entre eux a un fils. Cela peut être un problème de taille - en raison de la boucle infinie de la sérialisation, mais la structure d'origine, n'est plus que quelques K .... – Dani

0

IsReference est en effet la réponse officielle ici si vous voulez réellement préserver la forme du graphe d'objet. Voir http://msdn.microsoft.com/en-us/library/cc656708.aspx. Pouvez-vous préciser ce que vous voulez dire quand vous dites «ça n'a pas aidé»? Où avez-vous placé IsReference? Du côté client et côté serveur? Quelles erreurs avez-vous observées?

Si vous ne vous souciez pas de la préservation du ref, il existe différentes solutions qui impliquent la rupture du cycle de référence infini. Le plus simple est de supprimer l'attribut DataMember de "Father". Ou quelque chose avec une "propriété d'ombre":

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

Cela dépend vraiment fortement vos exigences ...

+0

J'ai mis le IsReference sur l'attribut DataContract, Dans l'article lié ils disent qu'il devrait être sur le problème [DataMember] MAIS ... étonnamment - [DataMember] ne sait pas sur ce drapeau. ce code ne compilera pas !! (qui est très étrange étant la source de l'exemple est MSDN ...) Systme.RunTime.Serialization DataMemberAttribute ne contient pas de définition pour IsReference = true ..... Un puzzle. – Dani

+0

Hmm, oui, n'a pas remarqué le sujet a été brisé ... Encore: - Avez-vous mis IsReference sur les types enfant et personne? - Que s'est-il passé exactement lorsque vous avez essayé IsReference? (Exceptions, etc.?) –

+0

Même exception - que rien n'a changé. L'exception est générale, rien de spécifique. J'ai lu un article qui suggère de passer à un autre sérialiseur. Je vérifie cette option et je rapporterai ici. J'ai demandé à quelqu'un @ Microsoft à propos de cet article, toujours en attente d'une réponse. – Dani

Questions connexes