2010-10-16 6 views
2

Si j'expose mes objets EF 4 Modèle (entités EF4) en tant que propriétés sur mon ViewModel, est-ce que je "brise" MVVM? Dois-je dupliquer chaque classe Model comme une sorte de DTO et exposer ces DTO à ViewModel? Je comprends la valeur théorique d'avoir la vue "ne sait pas" sur le modèle, mais la réalité est que (si je n'expose pas le modèle à la vue via le ViewModel), je devrais avoir quelques classes qui ont les mêmes propriétés que les classes Model à lier. Ensuite, dans le ViewModel, je devrais gratter les propriétés de ces objets DTO-ish pour mettre à jour les Entités EF appropriées (Modèle).Exposer des entités d'infrastructure en tant que propriétés sur ViewModel pour la liaison de données MVVM

Cela semble être beaucoup de code supplémentaire à écrire et à maintenir. Si j'expose les entités en tant que propriétés sur mon ViewModel (et lie à cela), je peux toujours utiliser les commandes (enregistrement ou suppression) dont le code/logique est défini dans les états ViewModel et enabled/disabled via la liaison aux propriétés ViewModel.

Si vous vous demandez: "Quel est le problème avec avoir à écrire un ou deux DTO pour votre ViewModel?" Vous pensez trop petit.

J'ai une application avec plus de 75 tables SQL (et donc 75+ entités EF4). Je n'ai pas envie d'écrire et de gérer plus de 75 DTO. Maintenant, je pourrais éventuellement utiliser T4 pour générer des DTO pour toutes mes entités et même avoir générer des classes partielles afin que je puisse "personnaliser" ces DTO générés sans perdre les personnalisations si je dois régénérer. Pourtant, j'ai besoin de sentir que ça vaut "la peine" de faire tout ça ... et je ne suis pas encore sûr de ça.

Pensées?

+1

Désolé, mais pensez à reformuler la question. Les trois derniers paragraphes sont essentiellement une diatribe. Sortez-le, concentrez-vous sur vos problèmes/préoccupations actuels - cela vous aidera à fournir une réponse précise. – RPM1984

+1

J'ai particulièrement aimé les trois derniers paragraphes pour faire apparaître ma réponse. il contient des informations importantes. – JanW

Répondre

1

Nous avons également fait face à ce problème avec environ 200 entités dans le modèle. Comme la liaison de données réécrit directement dans le modèle, l'infact ViewModel n'a plus aucun contrôle sur ces modifications apportées aux entités db. Pour le moment, nous avons trouvé une solution, que nous implémenterons dans le prochain cycle de refactoring. Nous utilisons également des modèles T4 pour améliorer certaines fonctionnalités manquantes. Donc, notre idée est d'avoir un ViewEntity et un DbEntity. Pour cela, vous n'avez pas besoin de créer/générer une autre classe DTO. Si vous instanciez une nouvelle entité, sans l'ajouter à ObjectContext, son comportement ressemble à un simple DTO.

Ainsi, notre solution sera:

  • télécharger et lier les entités db au contexte (nous utilisons des procédures stockées CLR et T4 généré Materializers)

  • créer une nouvelle vue entité pour chaque entité, qui sera exposée à la vue, à l'aide d'une méthode Clone() générée par T4, qui renvoie une version non liée de l'entité db.

Maintenant, vous avez le contrôle complet pour écrire de nouveau changement ou d'annuler des modifications dans votre viewmodel, depuis databinding à l'entité vue n'affecte pas l'entité db.

+0

Pourriez-vous en dire plus sur la méthode clone générée par T4? –

+0

Vous devez analyser les informations de modèle pour chaque entité, extraire des informations sur toutes les propriétés des primitives, à l'exception des clés primaires que vous ne reproduisez pas dans la méthode Clone.Vous devez ensuite créer la nouvelle entité et copier toutes ses propriétés de primitive à partir de l'entité de base de données donnée. La signature sera quelque chose comme ceci: public static TEntity Clone (TEntity dbEntity); Où TEntity est le nom complet de l'entité actuelle. Si vous avez besoin d'un exemple de code, demandez à nouveau – JanW