2009-04-16 7 views
2

Je sérialise un objet linq via WCF. Le dbml est configuré pour la sérialisation unidirectionnelle.Sérialisation d'entités linq avec WCF

Mes objets sont assez simples: Budget a une collection de BudgetLineItems. Chaque élément BudgetLineItem a un ItemCateogry.

Les éléments Budget/BudgetLineItems sont correctement numérotés. ItemCateogry sur chaque BudgetLineItem ne le fait pas, cependant. J'ai remarqué par défaut, linq n'a pas ajouté un [DataMember] sur ItemCategory pour chaque BudgetLineItem. Je l'ai ajouté manuellement et j'ai également supprimé toute référence circulaire possible sur l'entité ItemCategory avec [IgnoreDataMember]. Pas de chance, cependant.

questions:

  1. peut WCF, par défaut, SERIALIZE many-to-one relations, ou suis-je manque juste quelque chose? Je sais que les données sérialisées seraient plutôt redondantes avec les données ItemCategory dupliquées pour chaque BudgetLineItem, mais c'est très bien.

  2. Ai-je besoin de faire un DataContractSerializer personnalisé pour cela?

** EDIT ** En fait, qui a fait le travail (en ajoutant [DataMember]), je viens de ne pas mettre à jour la référence de service sur le client (duh).

NOUVELLE QUESTION: Est-il possible d'indiquer au concepteur linqtosql de gérer les champs [DataMember] et [IgnoreDataMember] sur une entité que le concepteur génère? Sinon, je devrai les mettre à jour chaque fois que j'enregistre le dbml.

Répondre

3

Wow vous avez réussi à sérialiser vos objets LINQ 2 SQL pour WCF? Quand j'ai essayé cela (très à contrecoeur, voir ci-dessous pourquoi) il est tombé, il y avait des relations dans mon entité L2S pointant vers les enfants, puis l'enfant pointant vers le parent et évidemment lors de l'énumération pour la construction du Objet WCF, il ne pouvait pas traverser l'arbre infiniment de cette façon et [pour le meilleur que je me souvienne] il en est résulté une exception de débordement, donc ce que je dis en gros, c'est méfiez-vous si vous descendez cette route!

Suite à la publication de Michael, je suggère de transformer vos objets WCF en objets POCO (représentation de modèle personnalisée). Je suis content que ce qui précède ne fonctionne pas, car je préfèrerais toujours créer un objet WCF personnalisé qui transporte un sous-ensemble de données propre, exactement ce dont la requête WCF a besoin et qui n'inclut pas une pile de données superflues envoyé à travers les données, et je suis sûr que vos entités L2S en ont beaucoup. La raison pour laquelle j'ai essayé d'envoyer mes données L2S directement à travers le fil était parce que je devais faire un moteur qui utilisait certaines règles, ces règles étaient stockées dans une corrélation d'environ 4 tables de base de données avec des relations et il n'était pas viable Objet WCF. Donc à la fin ce que j'ai fini par faire était d'étendre les classes de code personnalisé pour inclure Wcf.cs avec [DataContext] puis la propriété clonée pour la propriété les classes L2S -> classes personnalisées WCF. Il a fonctionné parfaitement à la fin et c'est le cloning procedure I used with instructions on my blog. Je suis heureux avec cela et je ne pense pas qu'il y ait une mauvaise pratique en cause. J'espère que cela t'aides.

+0

Merci pour l'info. Pour une sérialisation réussie, nous avons dû ajouter un [DataMemberIgnore] à tout accessoire qui était récursif (généralement la référence au parent), car ceux-ci ne seront pas sérialisés. Cela a incité à changer le dbml, qui bien sûr sera écrasé à chaque changement. Cela fonctionne, mais pas très homogène. Comme vous le savez, les objets sérialisés sont _huge_. heureusement, ce n'était que pour une preuve de concept (SQLRS2008 consommant une couche WCF à nos services pour nous débarrasser de la logique redudant) – ericvg

+0

OK non prob. Bien vérifier ma procédure de clonage, j'espère que cette route vous aidera. – GONeale

+0

Génial! Sauf que votre blog est parti :( – Moulde

1

vous ne devriez pas envoyer d'entités linq avec WCF. Au lieu de cela, créez votre propre datamodel d'entreprise et envoyez-les sur le réseau. Si jamais vous changez votre base de données, vous ne voulez pas changer tous les programmes qui se connectent à votre service

+0

convenu, mais dans le but de cet article particulier, nous échangeons cela. – ericvg

Questions connexes