Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu MEZIL

I love .Net

Abonnements

ADO .NET Data Services : un “vrai” contexte côté client

Une des forces d’Entity Framework est l’éco-système qui gravite autour. Même si ADO .NET Data Services peut être utilisé sans EF, j’incluerais tout de même cette technologie dans l’éco-système. En effet, si vous utilisez EF avec ADO.NET Data Services, vous n’avez presque plus rien à faire pour utiliser des requêtes LINQ côté client ainsi que pour persister les modifications.

Cependant, le proxy généré côté client a plusieurs défauts :

  • Prenons Northwind, si on ajoute un orderDetail à un order (order.OrderDetails), la propriété orderDetail.Order reste null. De même, si on affecte un order à l’orderDetails (orderDetail.Order), la collection d’orderDetail de l’order n’est pas modifée.
  • Si on charge les orders et ensuite les orderDetails, les collections OrderDetails des orders sont vides et la propriété Order des orderDetails est null. Pourtant, OrderID fait partie de la clé des orderDetails, donc on devrait avoir automatiquement la relation (comme le fait le contexte EF).
    //Pour avoir la relation avec ADO.NET Data Services, il faut utiliser la méthode Expand dans la requête ou utiliser la méthode LoadProperty à postériori. 
    Avec EF4, on peut intégrer dans le modèle toutes les FK (avec la V1, seules celles étant incluses dans la PK l’étaient). Ceci est une super nouvelle dans notre cas car ça signifie qu’en théorie, il est possible de regénérer automatiquement les relations.
  • Pour ajouter un order avec des (nouveaux) orderDetails, vous devez faire un Add sur l’order, puis sur tous les orderDetails (le contexte MS ignore les relations). Ensuite il faut encore appeler les méthodes SetLink et AddLink (parce que la clé de la table Orders est un Identity). Il faut donc écrire le code suivant:

context.AddToOrders(o);

foreach (var od in o.OrderDetails)

{

    context.AddToOrderDetails(od);

    context.AddLink(o, "OrderDetails", od);

    context.SetLink(od, "Order", o);

}

  • Le contexte MS ne gère pas non plus tout seul le tracking des modifications. Il faut manuellement appeler la méthode UpdateObject pour passer une entité dans l’état Modified.
  • Dans le cas d’un nouvel order, si on ajoute un orderDetail au contexte et qu’on ajoute seulement après l'order associé, on va avoir une exception lors du SaveChanges car le contexte ne modifie pas l’order des Add

Mon idée était de résoudre tous ces problèmes en codant un nouveau contexte ADO.NET Data Services basé sur le contexte MS. Bien sûr, je voulais une solution totalement générique (ie indépendante du modèle). Pour faire cela, J’ai utilisé un template T4 qui utilise les informations de l’edmx. Cela implique deux contraintes:

  • Vous devez utiliser EF côté serveur
  • Lorsque vous développez votre client, vous devez avoir accès à l’edmx (côté serveur)

Mon template résoud tous les problèmes énoncés précédemment. Mission remplie ! Smile

Vous pouvez le télécharger ici.

Vous pouvez ausi télécharger toute la solution (avec les tests unitaires) ici et le script de création de la base .

//J’admet que quelques parties du code sont assez “crades” mais ADO.NET Data Services est une techno extrêmement “fermée” et cela m’a parfois empêché de respecter les règles de l’art. J’aurais peut-être aussi eu de meilleures idées si je n’avais pas codé aussi tard la nuit Wink

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié jeudi 5 novembre 2009 03:12 par Matthieu MEZIL

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- SQL Server : Différence de calcul du CHECKSUM sur SQL Server 2005 et 2008 ou sur les plateformes 32 bits et 64 bits ? par SQL Server vu par Christian Robert le il y a 3 heures et 49 minutes

- 30 PSD gratuits pour vos jaquettes par Open Blog le il y a 6 heures et 22 minutes

- La recherche “People” sous MOSS 2007 : une alternative au WildCard par The Mit's Blog le il y a 7 heures et 26 minutes

- Comment supprimer l’espacement blanc autour d’une liste affichée dans une iFrame dans un formulaire Dynamics CRM par Bianca le 12-15-2009, 18:13

- Alternative au volet de navigation dans un formulaire Dynamics CRM 4.0 pour afficher un élément associé directement sur le formulaire par Bianca le 12-15-2009, 13:51

- Fond d’écran pour Noël par Open Blog le 12-15-2009, 10:56

- SQL Server 2008 R2 : Connexion à SQL Azure avec Management Studio ! par SQL Server vu par Christian Robert le 12-15-2009, 08:34

- SQL Server : Comment forcer le Shrink du journal de transaction? par SQL Server vu par Christian Robert le 12-14-2009, 21:50

- Calendrier complet des matchs de la Coupe du Monde ! par Le blog de Patrick le 12-14-2009, 15:20

- Rappel : Liste des raccourcis classiques sous Windows et merci Shift-F10 par The Mit's Blog le 12-14-2009, 14:24