Publié dimanche 21 mars 2010 21:25 par Audrey

[RIA Services] Include et DomainDataSource

Dans un de mes articles précédents, j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et pour cela je vais utiliser une méthode qui me parait plus simple mais moins paramétrable, je vais utiliser la méthode Include mise à disposition par Entity Framework pour récupérer explicitement les informations des autres entités ayant une relation avec l'entité requêtée à l'origine.

Dans notre exemple, nous allons de nouveau prendre les tables Customers et Orders de la base de données Northwind, ces deux tables sont reliées par une liaison grâce à la clé étrangère CustomerID se trouvant dans la table Orders.

FK

Il faut créer un ADO.NET Entity Data Model via Entity Framework avec les tables Customers et Orders, et ensuite un DomainService, où il ne faut pas oublier de cocher la case suivante :

Metada

Cela permet de générer la création d'un fichier metadata contenant les classes et les propriétés associées aux membres de nos entités.

Dans notre DomainService, il faut modifier la méthode GetCustomers générée et lui ajouter la méthode Include pour qu'elle puisse récupérer les informations concernant les commandes effectuées par le client :

public IQueryable<Customers> GetCustomers()
{
return this.ObjectContext.Customers.Include("Orders");
}


Ensuite dans le fichier metadata, généré il faut ajouter le tag [Include] au dessus de la propriété Orders de la class CustomersMetadata sur laquelle on souhaite effectuer l'include :

[Include]
public EntityCollection<Orders> Orders { get; set; }


Et enfin, il ne reste plus qu'à faire le DomainDataSource et le Binding côté XAML :

<RIAControl:DomainDataSource x:Name="source" QueryName="GetCustomers" AutoLoad="True">
  <RIAControl:DomainDataSource.DomainContext>
     <domain:NorthwindContext />
  </RIAControl:DomainDataSource.DomainContext>
</RIAControl:DomainDataSource>

<ComboBox ItemsSource="{Binding Data,ElementName=source}" Name="cbCustomers" />
<StackPanel DataContext="{Binding ElementName=cbCustomers, Path=SelectedItem}" >
     <RIAData:DataGrid ItemsSource="{Binding Orders}" AutoGenerateColumns="True" Name="dgOrders" />
</StackPanel>

Et l'on obtient le résultat suivant :

Resultat
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 :

# re: [RIA Services] Include et DomainDataSource @ dimanche 21 mars 2010 21:44

Bonjour Audrey,

Comment vas-tu ? :)

Deux petites questions pour toi:

Dans le cadre d'un projet MVVM (donc plus de domaindatasource dans la vue), crées tu tes DomainDataSource à la main dans le model où tu utilises direct les DataContext dans le ViewModel ?

Et deuxième question:

Là tu génères des métadatas, as-tu remarqué que si on déporte le DataModel dans une autre assembly (dans un cadre d'une architecture n-tiers par exemple), on ne peut plus générer de Metadata. Y a-t-il une alternative ? Si non, ne trouve tu pas que WCF Ria Services est anti-architecture (on revient à l’air des DataSet en 2005 lié à l’IHM).

PS : par contre attention dans ton exemple cela implique que pour le rapatriement des entités tu vas à chaque fois rapatrier les relations. Pour ma part je mets un booléan en paramètre ou je crée une méthode personnalisé.

Merci pour ton post et tes réponses

Julien.Dollon

# re: [RIA Services] Include et DomainDataSource @ dimanche 21 mars 2010 21:56

Bonjour Julien !

Pour un projet MVVM, perso je préfère utiliser les DataContext dans le ViewModel.

Et pour ta deuxième question, je te conseille ce lien : http://www.euri.com/Blog/tabid/85/EntryId/21/Using-RIA-Services-with-data-access-in-a-separate-assembly-and-namespace.aspx

Concernant ton PS, mon exemple est là pour l'exemple et montrer qu'il est possible de faire ça, après à chacun de l'utiliser à sa façon :)

Audrey

# re: [RIA Services] Include et DomainDataSource @ lundi 22 mars 2010 10:07

Ce qui est important là-dedans c'est que c'est grâce à Entity Framework que tu peux faire tout ça. Le reste est presque anecdotique Smile

Matthieu MEZIL


Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 4 heures et 33 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59