Académique Documents
Professionnel Documents
Culture Documents
James RAVAILLE
http://blogs.dotnet-france.com/jamesr
2 Premiers pas avec ADO .NET Data Services
Sommaire
1 Introduction ..................................................................................................................................... 3
2 Réalisation d’une application .......................................................................................................... 4
2.1 Présentation ............................................................................................................................ 4
2.1.1 Création de la base de données ...................................................................................... 4
2.1.2 Alimentation de la base de données ............................................................................... 6
2.1.3 Architecture de l’application ........................................................................................... 6
2.1.4 Création des projets ........................................................................................................ 7
3 Création du service d’accès et de gestion des données .................................................................. 8
3.1 Création du composant Entity Data Model ............................................................................. 8
3.2 Création du service d’exposition des données...................................................................... 14
3.3 Définition des règles d’accès sur les entités.......................................................................... 16
3.4 Définir des opérations de service .......................................................................................... 17
4 Affichage et gestion des données ................................................................................................. 19
4.1 Création d’une référence de service ..................................................................................... 19
4.2 Création d’une classe de contexte pour les formulaires ....................................................... 21
4.3 Création du formulaire FrmDetailStagiaire ........................................................................... 22
4.3.1 Design du formulaire ..................................................................................................... 22
4.3.2 Code-behind du formulaire ........................................................................................... 23
4.4 Création du formulaire FrmGestionListeStagiaires ............................................................... 25
4.4.1 Design du formulaire ..................................................................................................... 25
4.4.2 Code-behind du formulaire ........................................................................................... 27
5 Exécution de l’application ............................................................................................................. 35
5.1 Exécution des fonctionnalités de l’application...................................................................... 35
5.1.1 Ajout d’un stagiaire ....................................................................................................... 35
5.1.2 Modification d’un stagiaire ........................................................................................... 36
5.1.3 Suppression d’un stagiaire ............................................................................................ 37
5.2 Observation des traces HTTP ................................................................................................ 37
6 Conclusion ..................................................................................................................................... 38
1 Introduction
Ce cours permet de vous montrer, comment mettre en œuvre de manière pratique ADO .NET
Data Services, afin de vous permettre de comprendre ses principes fondamentaux. De manière
volontaire, nous ne rentrerons pas dans les détails. En revanche, les chapitres suivants publiés sur
Dotnet-France, détailleront chacune des parties de ce document.
2.1 Présentation
L’application que nous allons développer tout au long de ce cours, aura pour but de consulter
et de gérer une liste de stagiaires, et des cours auxquels ils sont inscrits. Elle sera constituée de deux
formulaires :
Stagiaire Cours
PK Identifiant
0..n 0..n PK Identifiant
Suit
Nom Libelle
Prenom NombreJours
Pour créer ce schéma de base de données, lancer SQL Server Management Studio (interface
d’administration de SQL Server). Créez une base de données nommée DotnetFrance, puis dans une
fenêtre de requête, exécutez le jeu d’instructions Transact-SQL suivant :
-- SQL
USE DotnetFrance
-- SQL
Client_DataServices
Windows Forms
DotnetFrance_DataServices
Projet Web
DotnetFrance
Nous allons créer notre composant d’accès et gestion de données à partir de notre base de
données DotnetFrance. Nous sélectionnons alors l’item « Générer à partir de la base de données »,
et cliquons sur le bouton « Suivant ». La fenêtre suivante apparaît :
Dans cette fenêtre, choisir une connexion pointant vers notre base de données, ou alors
créer une nouvelle connexion en cliquant sur le bouton « Nouvelle connexion… ». Dans le second cas,
la fenêtre suivante apparaît :
Dans cette fenêtre, saisir le nom de votre instance SQL Server, sur laquelle votre base de
données est hébergée. Puis choisissez votre mode d’authentification, ainsi que la base de données.
Cliquer sur le bouton « Tester la connexion », afin de vérifier si toutes ces informations sont
correctes. Cela est nécessaire, car elles seront utilisées pour créer la chaîne de connexion. Une fois
cette fenêtre validée, nous revenons à la fenêtre suivante :
Choisissons les tables, vues et procédures stockées, que nous allons utiliser dans notre
modèle d’entités. Dans notre exemple, nous allons gérer les données contenues dans les tables
Cours, Stagiaires et Stagiaire2Cours, que nous sélectionnons. Cliquons ensuite sur le bouton
« Terminer ».Le model suivant apparaît :
Vous pouvez observer que la « table de liaison » Stagiaire2Cours, présente dans le modèle
logique de données de la base de données, n’est pas présente. En effet, le Framework Entity se base
sur une vision conceptuelle de la base de données.
Ces informations sont importantes, car elles devront être utilisées ultérieurement, lors de la
création de l’application Windows Forms, consommant notre service de données.
// C#
using System;
using System.Data.Services;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Web;
' VB .NET
Imports System.Data.Services
Imports System.Linq
Imports System.ServiceModel.Web
' Cette méthode n'est appelée qu'une seule fois pour initialiser les
stratégies au niveau des services.
Public Shared Sub InitializeService(ByVal config As
IDataServiceConfiguration)
' TODO : définissez des règles pour indiquer les jeux d'entités
et opérations de service visibles, pouvant être mis à jour, etc.
' Exemples :
' config.SetEntitySetAccessRule("MyEntityset",
EntitySetRights.AllRead)
' config.SetServiceOperationAccessRule("MyServiceOperation",
ServiceOperationRights.All)
End Sub
End Class
La classe de notre composant d’accès aux données ADO .NET étend la classe générique
System.Data.Services.DataService<T>. Elle sera le point d'entrée principal pour notre service de données
ADO .NET. Le type précisé en paramètre correspond à la classe permettant d’accéder et gérer les
données. Dans notre cas, il s’agit de la classe de gestion des entités : DotnetFranceEntities. La
définition de la classe obtenue est alors la suivante :
// C#
using DotnetFranceModel;
' VB .NET
Imports DotnetFranceModel
End Class
// C#
' VB .NET
Voici un exemple : soit une méthode, permettant d’obtenir le nombre de stagiaires étant
inscrit à au moins un cours :
// C#
config.SetServiceOperationAccessRule("GetNombreStagiairesInscrits",
ServiceOperationRights.All);
}
[WebGet]
public int GetNombreStagiairesInscrits()
{
return this.CurrentDataSource.Stagiaire
.Count(oStagiaire => oStagiaire.Cours.Count > 0);
}
}
' VB .NET
' Cette méthode n'est appelée qu'une seule fois pour initialiser les
stratégies au niveau des services.
Public Shared Sub InitializeService(ByVal config As
IDataServiceConfiguration)
config.SetEntitySetAccessRule("Stagiaire", EntitySetRights.All)
config.SetEntitySetAccessRule("Cours", EntitySetRights.AllRead)
config.SetServiceOperationAccessRule("GetNombreStagiairesInscrits",
ServiceOperationRights.All)
End Sub
<WebGet()> _
Public Function GetNombreStagiairesInscrits() As Integer
Return Me.CurrentDataSource.Stagiaire.Count(Function(oStagiaire)
oStagiaire.Cours.Count > 0)
End Function
End Class
Afin de pouvoir utiliser les classes d’entité dans le projet DotnetFrance_IHM, il est nécessaire
d’ajouter une référence vers l’assembly System.Data.Entity.dll du Framework .NET.
Dans cette fenêtre, recherchez ou spécifiez l’url du service de données à références. Puis,
spécifier le nom de la référence de service : RefDotnetFrance_DataServices. Puis cliquez sur le
bouton OK, pour valider la création de cette référence de service. Les modifications suivantes sont
alors apportées au projet :
- Ajout automatique des références suivantes vers des composants du Framework .NET :
o System.Data.Services.Client.dll
o System.Runtime.Serialization.dll
La référence de service créée ci-dessus crée différents fichiers dans l’application (affichez
tous les fichiers dans l’explorateur de solutions pour l’observer :
données. Et à travers ces objets, nous consommerons le service de données ADO .NET, que vous
venons de créer.
Pour faciliter ce partage, nous allons créer une classe de contexte que nous appellerons
FrmContexte. Cette classe dérive de la clase System.Windows.Forms.Form du Framework .NET, et
sera la classe de base des deux autres formulaires de notre application. On obtient alors le
diagramme de classes suivant :
' VB .NET
Return FrmContexte._ContexteDonnees
End Get
Private Set(ByVal value As DotnetFranceEntities)
End Set
End Property
Le contexte de données de l’application est créé une seule fois, lors du premier accès. Vous
remarquez qu’il est instancié avec une chaîne de caractère, correspondant à l’URL de notre service
de données. Cette URL est définie dans le fichier de configuration de l’application. Ainsi, vous devez :
TxtIdentifiant
TxtNom
TxtPrenom
LstCours
CmdValider CmdAnnuler
LstCours
AllowUserToAddRows False
AllowUserToDeleteRows False
Columns Ajout de deux colonnes :
- Libelle : liée à la propriété Libelle
- Durée : liée à la propriété NombreJours
DataSource BdsCours
MultiSelect False
ReadOnly True
RowHeadersVisible false
SelectionMode FullRowSelect
o Afficher l’identifiant. Dans le cas d’un ajout d’un stagiaire, les caractères « -- » seront
affichés. En effet, la colonne Identifiant de la table Stagiaire étant une colonne
identité, l’identifiant du stagiaire sera déterminé par SQL Server lors de l’ajout du
stagiaire.
o Afficher le nom, prénom, et la liste des cours auxquels le stagiaire est inscrit.
- Implémenter l’évènement Click sur le bouton CmdValider, afin d’enregistrer que l’utilisateur
confirme l’ajout / modification du stagiaire.
- Implémenter l’évènement Click sur le bouton CmdAnnuler, afin d’enregistrer que l’utilisateur
annule l’ajout / modification du stagiaire.
// C#
BdsCours.DataSource = this.oStagiaire.Cours;
}
' VB .NET
BdsCours.DataSource = Me.oStagiaire.Cours
End Sub
End Class
CmdFermer
// C#
' VB .NET
// C#
' VB .NET
// C#
' VB .NET
// C#
' VB .NET
// C#
try
{
// Initialisation.
oStagiaire = new Stagiaire();
// Affichage.
oResult = oForm.ShowDialog();
if (oResult == DialogResult.OK)
{
// Ajout du stagiaire en base de données.
ContexteDonnees.AddToStagiaire(oStagiaire);
ContexteDonnees.SaveChanges();
' VB .NET
Try
' Initialisation.
oStagiaire = New Stagiaire()
' Affichage.
oResult = oForm.ShowDialog()
// C#
try
{
// Initialisation.
oStagiaire = this.StagiaireCourant;
if (oStagiaire != null)
{
// Création du formulaire de détail sur un stagiaire.
oForm = new FrmDetailStagiaire(oStagiaire);
// Affichage.
oResult = oForm.ShowDialog();
if (oResult == DialogResult.OK)
{
// Enregistrement des modifications dans la base de
données.
ContexteDonnees.UpdateObject(oStagiaire);
ContexteDonnees.SaveChanges();
}
else
{
// Annulation des modifications.
ContexteDonnees.LoadProperty(oStagiaire, "Nom");
ContexteDonnees.LoadProperty(oStagiaire, "Prenom");
BdsStagiaires.ResetCurrentItem();
}
}
}
catch (Exception aEx)
{
MessageBox.Show(aEx.Message);
}
}
' VB .NET
Try
' Initialisation.
oStagiaire = Me.StagiaireCourant
' Affichage.
oResult = oForm.ShowDialog()
Notez que dans la base de données, toutes les relations d’association entres les tables de
notre modèle acceptent la suppression en cascade. De ce fait, nous ne supprimons pas les
inscriptions des stagiaires aux cours, avant de supprimer un stagiaire.
// C#
try
{
// Initialisation.
oStagiaire = this.StagiaireCourant;
if (oStagiaire != null)
{
// Demande de confirmation.
oResult = MessageBox.Show("Etes-vous sûrs de vouloir
supprimer ce stagiaire ?", "Demande de confirmation",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (oResult == DialogResult.Yes)
{
// Suppression du stagiaire dans la base de données.
oStagiaire.Supprimer();
' VB .NET
Try
' Initialisation.
oStagiaire = Me.StagiaireCourant
5 Exécution de l’application
On peut observer que la première requête HTTP envoyée, permet d’accéder à la liste des
stagiaires, contenue dans la base de données.
6 Conclusion
Ce cours constitue une entrée en matière sur ADO .NET Data Services. Les prochains cours
publiés sur Dotnet-France détailleront différents points simplement présentés dans ce support
(sécurité, requêtes d’accès aux données définition des droits sur les données, …).