2011-03-31 6 views
1

J'ai un workflow et je le persiste dans la base de données. Tout a bien fonctionné jusqu'à ce que j'essaie d'utiliser des entités dans le flux de travail. Parce que j'utilise POCOs le workflow semble avoir du mal à sérialiser l'objet, en particulier les relations.Problème avec WF4 Poco persistant

Maintenant, la chose étrange est, la première fois que je démarre le workflow, la sérialisation fonctionne et l'objet est chargé dans le flux de travail lors de la reprise du signet. Mais cette fois, lorsque le workflow persiste, j'obtiens l'exception suivante: "L'objet EntityCollection n'a pas pu être sérialisé Ce type d'objet ne peut pas être sérialisé lorsque le RelationshipManager appartient à un objet entité qui n'implémente pas IEntityWithRelationships."

J'ai vu que cela pourrait aider, mais je n'ai pas de service et je n'ai pas compris comment le faire fonctionner sans un. http://msdn.microsoft.com/en-us/library/ee705457.aspx

Quelqu'un a-t-il des suggestions? Ou pensez-vous que passer à l'utilisation des services résoudrait mon problème?

Merci

+0

Quels sont ces objets? Souvent, WF utilise des objets qui sont en fait des objets de domaine, et non des objets qui "appartiennent" à la WF. Je veux toujours que mes objets de domaine soient disponibles, et non pas persistés et/ou dupliqués dans une WF. Donc toute ma persistance d'objet est par ORM conventionnel. Le WF conserve uniquement les ID. Lorsque le WF s'active, il récupère tous les objets dont il a besoin, puis les libère tous une fois terminé. WF ne doit pas conserver les objets de domaine de toute façon, ne persister que ses objets possédés, c'est-à-dire ceux qui n'ont que la portée dans le WF. Si vos POCO appartiennent réellement à la WF, je ne sais pas ce qui est le mieux, je n'ai jamais eu besoin de ça moi-même. – Sisyphus

+0

@Sisyphus Merci, j'ai décidé de le faire de cette façon et seulement enregistrer les identifiants. J'ai besoin des valeurs d'un utilisateur dans le flux de travail. Est-il possible que je ne peux charger l'utilisateur qu'une seule fois et l'utiliser dans toutes les activités, sans qu'il soit persisté? – Nischo

+0

Vous pouvez ajouter un membre et le marquer NonSerialized. De cette façon, il est disponible pour toutes les activités à utiliser. Quand et où et comment vous choisissez d'instancier les membres qui ne sont pas persistants dépendra de vos spécificités. La seule règle est la plus évidente - vous êtes responsable de l'instanciation explicite de tous les membres qui n'ont pas été persistés avant d'être accédés. Si vous utilisez des variables membres au lieu d'instancier des objets au point d'utilisation, assurez-vous de connaître tous les points où vos flux de travail peuvent être inactifs puis réhydrater, ne négligez pas les retards etc. – Sisyphus

Répondre

1

objets stockés comme variables dans flux de travail sont sérialisés et désérialisée lors de l'enregistrement à la persistance. Vous n'avez pas la possibilité de participer à ce processus de sérialisation comme c'est le cas avec un service WCF. Vos options consisteraient à utiliser des types qui ne proviennent pas de votre bibliothèque Entity Framework POCO ou à déplacer le code vers un service que vous appelez depuis WF.

+0

Merci, c'était la réponse que je cherchais. J'ai pris la manière de Sisyphe de le faire et ne fais que persister la carte d'identité. – Nischo