S4 Cours1 C# Partie4
S4 Cours1 C# Partie4
S4 Cours1 C# Partie4
Technologies DotNet
Hiba Chougrad
Année-universitaire: 2021-2022
23/11/2021 1
23/11/2021 2
Plan
L’environment .NET
Initiation à la programmation C#
Programmation Orientée Objet C#
Les contrôles avancés
23/11/2021 3
ADO.NET
23/11/2021 4
On peut utiliser Visual Studio pour créer et mettre à jour un fichier de base de
données local dans SQL Server Express LocalDB.
On peut également créer une base de données en exécutant des instructions
Transact-SQL dans la fenêtre de l'outil SQL Server Object Explorer de Visual
Studio.
ADO.NET
ADO.NET : ActiveX Data Objects
• Une technologie de base de données de la plate-forme .NET (Dot Net) et repose sur
Microsoft ActiveX Data Objects.
• ADO.NET fait partie intégrante du .NET Compact Framework et fournit un accès aux
données relationnelles, aux documents XML et aux données d'applications.
• ADO fournit des services d’accès et de gestion de données situées sur une base de
données relationnelle (SQL Server, MySQL...) ou non SQL. Il est constitué de deux
composants : un premier pour la connexion et un second pour la gestion.
23/11/2021 13
ADO.NET
Deux modes de fonctionnement
• Mode connecté : le programme se connecte à la base de données et
effectue des opérations comme SELECT, INSERT, UPDATE... La connexion
est ensuite fermée et aucune donnée n’est donc stockée en mémoire sur le
client. (mode classique)
ADO.NET
ADO.NET définit les objets DataSet et DataTable optimisés pour le déplacement d’ensembles
de données déconnectés. Il inclut également les objets Connection et Command traditionnels,
ainsi qu'un objet DataReader qui ressemble à un jeu d'enregistrements ADO en lecture seule.
Voici quelques classes de ADO.NET :
23/11/2021 15
• Préparer la commande
string queryString = "select * from Personne";
SqlCommand command = new SqlCommand(queryString, connection);
String query = "update personne set nom =@nom, prenom = @prenom where num = @num";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@nom","denzel");
command.Parameters.AddWithValue("@prenom","washington");
command.Parameters.AddWithValue("@num",15);
int i = command.ExecuteNonQuery();
Console.WriteLine($"number of updated people is {i}");
23/11/2021 24
Ensuite :
• Installer les deux
• (Re)lancer Visual Studio
• Créer un nouveau projet C# (console)
23/11/2021 26
• Pour chaque table de la base de données, on crée un modèle, une classe C#,
ayant comme attributs les colonnes de cette table
• Il faut mettre tout le code correspondant à l’accès aux données (de la base de
données) dans des nouvelles classes et interfaces qui constitueront la couche
DAL : Data Access Layer (DAO en Java)
23/11/2021 28
using System.Data.SqlClient;
namespace MyProject {
class MyConnexion {
private static SqlConnection connection;
private MyConnexion() {
string connectionString = @"Data Source=(…"
SqlConnection connection = new SqlConnection(connectionString);
try {
connection.Open();
}
catch(SqlException e) {
connection = null;
Console.WriteLine(e.StackTrace);
}
}
23/11/2021 29
namespace MyProject {
public interface IPersonne{
int Save(Personne personne);
int Update(Personne personne);
int Delete(int id);
List<Personne> FindAll();
Personne FindById(int id);
}
}
23/11/2021 32
class Program {
static void Main(string[] args) {
PersonneRepository personneRepository = new PersonneRepository();
List<Personne> personnes = personneRepository.FindAll();
personnes.ForEach(personne => Console.WriteLine(personne.Nom + " " +personne.Prenom));
Console.WriteLine("Fin");
}
}
23/11/2021 35
LINQ
23/11/2021 36
LINQ ?
• Language-INtegrated Query (ou Requête intégrée au langage en Français)
• est un composant du .NET Framework
• était un projet de recherche Microsoft avant qu’il soit intégré dans .NET
Framework
• est inspiré par le langage SQL
• ajoute de grandes capacités d’interrogation sur des données aux langages
.NET
• s’applique sur les listes, les objets, les fichiers XML, les entités, les bases de
données relationnelles...
23/11/2021 37
LINQ
23/11/2021 38
LINQ
23/11/2021 39
LINQ
23/11/2021 40
LINQ
23/11/2021 41
Exemple (LINQ)
• Exemple requête
// data source
int[] numbers = new int[8] {1, 2, 3, 4, 5, 6, 7, 8};
// query expression
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// query execution in foreach
foreach (int num in numQuery)
Affiche :
{
2468
Console.Write("{0} ", num);
}
23/11/2021 42
Exemple (LINQ)
• Explication
23/11/2021 43
Exemple (LINQ)
• Attention !
Exemple (LINQ)
• Exemple avec expression Lambda
Affiche :
2468
23/11/2021 45
Exemple (LINQ)
• Il est aussi possible de définir plusieurs conditions
int[] numbers = new int[8]{1, 2, 3, 4, 5, 6, 7, 8};
var numQuery = Affiche :
from num in numbers 268
where (num % 2) == 0 && (num > 5 || num < 3)
select num;
foreach (int num in numQuery) { Console.Write("{0} ", num); }
LINQ to Objects
23/11/2021 47
LINQ to Objects
• Etant donnée la classe Personne suivante
class Personne
{
public Personne(int num, string nom, string prenom,int budget)
{
this.Nom = nom;
this.Prenom = prenom;
this.Num = num;
this.Budget = budget;
}
public int Num { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public int Budget { get; set; }
}
23/11/2021 48
LINQ to Objects
• Créons une liste a partir de cette classe Personne
List<Personne> personnes = new List<Personne>()
{
new Personne(1,"wick","john",500),
new Personne(2,"abruzzi","john",700),
new Personne(3,"dalton","jack",300),
new Personne(4,"white","mike",800),
};
LINQ to Objects
• Autre solution avec l’expression Lambda
LINQ to Objects
• Si on veut sélectionner seulement quelques attributs (et les renommer)
var persoQuery =
from perso in personnes
where (perso.Budget > 500)
select new {
Name = perso.Nom, // on renomme l’attribut Nom en Name et Num en Number
Number = perso.Num
};
foreach ( var perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Name } {perso.Number }");
}
Mai
ça affiche :
Je m’appelle abruzzi 2
Je m’appelle white 4
23/11/2021 51
LINQ to Objects
• Autre solution avec l’expression Lambda
var persoQuery = personnes
.Where(elt => elt.Budget > 500)
.Select(elt => new {
Name = elt.Nom,
Number = elt.Num
}
);
foreach ( var perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Name }{perso.Number }");
}
ça affiche :
Je m’appelle abruzzi 2
Je m’appelle white 4
23/11/2021 52
LINQ to Objects
23/11/2021 53
LINQ to Objects
• Exemple avec orderby
IEnumerable<Personne> persoQuery =
from perso in personnes
where ( perso.Budget >= 500 )
orderby perso.Nom ascending // ou descending
select perso;
foreach ( Personne perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Prenom } { perso.Nom
}");
}
ça affiche :
Je m’appelle john abruzzi
Je m’appelle mike white
Je m’appelle john wick
23/11/2021 54
LINQ to Objects
• La solution avec l’expression Lambda
IEnumerable<Personne> persoQuery =
personnes.Where(perso => perso.Budget >= 500)
.OrderBy(perso => perso.Nom);
foreach ( Personne perso in persoQuery ){
Console.WriteLine($"Je m’appelle { perso.Prenom }{ perso.Nom }");
}
ça affiche :
Je m’appelle john abruzzi
Je m’appelle mike white
Je m’appelle john wick
23/11/2021 55
LINQ to Objects
• Exemple avec group ... by ... into
var persoQuery =
from perso in personnes
group perso by perso.Prenom into initial
select initial;
23/11/2021 56
LINQ to Objects
• Exemple avec group ... by ... into
foreach (IGrouping<string, Personne> elt in persoQuery){
Console.WriteLine(elt.Key);
foreach (var perso in elt){
Console.WriteLine(" {0}, {1}", perso.Prenom, perso.Nom);}
}
ça affiche :
john
john, wick
john, abruzzi
jack
jack, dalton
mike
mike, white
23/11/2021 57
LINQ to Objects
• Solution avec les expressions Lambda
var persoQuery =
personnes.GroupBy(perso => perso.Prenom);
foreach (IGrouping<string, Personne> elt in
persoQuery)
{
Console.WriteLine(elt.Key);
foreach (var perso in elt){
Console.WriteLine(" {0}, {1}", perso.Prenom, perso.Nom);}
}
23/11/2021 58
LINQ to Objects
• Considérons la deuxième liste suivante
LINQ to Objects
• Solution avec join ... on ... equals
// join permet de faire la jointure
var persoSportifQuery =
from perso in personnes
join sportif in sportifs
on perso.Num equals sportif.Num
select new {
Name = perso.Nom,
Sport = sportif.Prenom
};
// select new permet de construire un nouvel objet
foreach (var elt in persoSportifQuery){
Console.WriteLine("{0} {1}", elt.Name, elt.Sport);
}
23/11/2021 60
LINQ to Objects
• Solution avec l’expression Lambda
var persoSportifQuery = personnes.Join(
sportifs,
perso => perso.Num,
sportif => sportif.Num,
(perso, sportif) => new {
Name = perso.Nom,
Sport = sportif.Prenom
}
);
foreach (var elt in persoSportifQuery){
Console.WriteLine("{0} {1}", elt.Name, elt.Sport);
}
23/11/2021 61
LINQ to SQL
23/11/2021 62
LINQ to SQL
• Créer une base de données SQL Server
23/11/2021 63
LINQ to SQL
• Créer une table
23/11/2021 64
LINQ to SQL
• Ajouter des tuples dans la table
23/11/2021 65
LINQ to SQL
• Etape 2 : ajouter le fichier de classe de LINQ to SQL
23/11/2021 66
LINQ to SQL
• Etape 2 : vérifier l’ajout du fichier contexte
23/11/2021 67
LINQ to SQL
• Si Classes LINQ to SQL n’existe pas
23/11/2021 68
LINQ to SQL
• Etape 3 : intérroger la base de données
23/11/2021 69
LINQ to SQL
23/11/2021 70
LINQ to SQL
23/11/2021 71
LINQ to SQL
23/11/2021 72
LINQ to SQL
23/11/2021 73
LINQ to SQL
23/11/2021 74
Exemple
• Trouver une personne
Personne p = db.Personne.First(perso => perso.nom.Equals("wick"));
Console.WriteLine($"je m’appelle {p.prenom.Trim()} {p.nom.Trim()}");
Exemple
• Modifier une personne
Personne p = db.Personne.First(perso => perso.nom.Equals("wick"));
p.nom = "abruzzi";
db.SubmitChanges();
Exemple
• On peut aussi faire
var deletedPersonQuery =
from perso in db.Personne
where perso.nom.Equals("wick")
select perso;
if (deletedPersonQuery.Count() > 0){
db.Personne.DeleteOnSubmit(deletedPersonQuery.First());
db.SubmitChanges();
}
23/11/2021 77
LINQ
23/11/2021 78
Entity Framework
23/11/2021 79
Introduction
Introduction
C’est quoi un ORM ?
23/11/2021 81
Introduction
Dans le cas d’Entity Framework
Les entités : des classes décorées (annotées)
Le gestionnaire d’entités : Linq to Entities
Trois approaches
• Code First : on crée les entités puis Visual Studio génère la base de données
• Database First : on crée la base de données (ou on a une base de données qui
existe déja) et Visual Studio génère nos entités a partir de cette base de données
• Model First : on crée notre modèle (de classe) et Visual Studio génère la base de
données et les entités correspondantes
23/11/2021 82
Code First
• Créez une nouvelle solution pour ce chapitre
• Créez un projet pour chaque exemple
Etapes à suivre:
• Création d’un projet Console
• Intégrer Entity Framework dans le projet
• Préparer le contexte Code First
• Créer les entités
• Générer la base de données et manipuler les données avec LINQ to Entities
23/11/2021 83
Code First
• Pour intégrer Entity Framework dans le projet, on utilise NuGet.
23/11/2021 84
Code First
Utiliser NuGet pour référencer Entity Framework
• Faire clic droit sur Références dans l’Explorateur de solution
• Choisir Gérer les packages NuGet
• Aller dans l’onglet Parcourir et chercher Entity Framework
• Choisir la dernière version stable et installer
• Accepter, attendre la fin de l’installation et aller vérifier dans la rubrique Références l’ajout des
packages relatifs à Entity Framework
Préparons le contexte Code First
• Clic droit sur le projet, Ajouter > Nouvel élément
• Dans Eléments Visual C#, cliquer sur Données et séléctionner ADO.NET Entity Data
Model
• Valider
• Choisir Modèle vide Code First et cliquer sur Terminer
23/11/2021 85
(Facultatif)
Référencer Entity Framework sans accès Internet
Code First
Contenu initial de Model1.cs
public class Model1 : DbContext Et si on veut donner plus de
{ détails?
public Model1(): base("name=Model1"){} Par exemple: sur la clé
} primaire, préciser la taille
//Dans ce fichier, on ajoute les entités qu’on va créer d’un champ, ….
Code First
Décorateurs pour Personne
• [Table("personnes")] : indique que la table correspondante a cette entité sera nommée personnes
• [Column("ID")] : permet d’avoir un nom de colonne (ID) différent de celui de l’attribut
• [Key] : indique que cet attribut correspond à la clé primaire de la table
• [DatabaseGenerated(DatabaseGeneratedOption.Identity)] : précise que la clé primaire est Auto-Increment
(autres valeurs possibles : None et Computed)
• [MaxLength(20),MinLength(2)] : indique la longueur max et min de la chaine de caractère
Autres décorateurs
• [NotMapped] : indique que l’attribut sera utilisé seulement niveau applicatif et qu’il n’aura pas de correspondance
dans la base de données
• [Required] : précise que cette colonne ne prend pas la valeur null
• [ForeignKey("nomColonneTableOrigine")] : indique que cet attribut provient d’une autre table et fait référence
au nom de la clé étrangère
• [Display(Name = "Valeur à afficher")] : indique la valeur à afficher lorsqu’on fait référence à cet attribut
dans un formulaire par exemple
• [DataType(DataType.Type)] : précise un type spécifique d’un attribut : Password, Date...
• [Order] : doit être utilisé avec [Key] lorsque la clé primaire est composée
• …
23/11/2021 88
Code First
Attention :
• Entity Framework ne supporte pas certains types C# tels que: char...
• La liste des types compatibles :
https://www.devart.com/dotconnect/db2/docs/DataTypeMapping.html
23/11/2021 89
Code First
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Table("personnes")]
public class Personne
{
[Column("ID")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column("LastName")]
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
[Column("FirstName")]
public string Prenom { get; set; }
public int Age { get; set; }
}
23/11/2021 90
Code First
• Il faut alors mettre à jour Model1.cs
// on persiste la personne
model.Personnes.Add(personne);
model.SaveChanges();
}
23/11/2021 91
Code First
• Dans le Main, on prépare les objets à persister
// on persiste la personne
model.Personnes.Add(personne);
model.SaveChanges();
Code First
• Soit une autre entité Adresse avec une clé primaire composée et une clé étrangère
Code First
• Mettons à jour Model1.cs
public class Model1 : DbContext
{
public Model1(): base("name=Model1"){}
public virtual DbSet<Personne> Personnes { get; set;}
public virtual DbSet<Adresse> Adresses { get; set;}
}
Code First
Deux tables ont été créées
• Personne avec les colonnes Id, Nom, Prenom et Age
• Adresse avec les colonnes Rue, Ville, CodeP et PersonneId (une clé étrangère
correspondant à l’identifiant d’une Personne)
Aller dans le menu Affichage et cliquer sur Explorateur d’objets SQL Server
Etendre la rubrique SQL Server
Chercher la base de données et vérifier l’existence des deux tables:
23/11/2021 95
Code First
Les relations bidirectionnelles
• Pour une adresse donnée, on peut facilement connaitre la personne propriétaire
• Pour une personne donnée, il est plus difficile de trouver son adresse
• Ceci peut devenir plus simple si on rend les relations bidirectionnelles
public class Personne{
[Column("ID")] Propriétés de navigation :
[Key] Public Personne Personne {}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] de l’entité Adresse et
public int Id { get; set; } public Icollection <Adresse>
[Column("LastName")] Adresses de l’entite Personne
[MaxLength(20),MinLength(2)] permettent de récupérer
public string Nom { get; set; } respectivement la liste d’adresses
[Column("FirstName")] d’une personne et la
public string Prenom { get; set; } personne propriétaire d’une
public int Age { get; set; } adresse.
public ICollection<Adresse> Adresses { get; set; }
}
23/11/2021 96
Code First
Les relations bidirectionnelles
• Pour faire la modification
var personToBeUpdated = (from p in model.Personnes
where p.Nom.Equals("Pradel")
select p).First();
personToBeUpdated.Prenom = "Michel";
model.SaveChanges();
• Pour la suppression
Code First
La migration
• Si on veut ajouter une nouvelle colonne dans une table? (ou modifier la table d’une manière
plus générale)
Code First
La migration
Ajoutons l’attribut tel à la classe Personne
public class Personne{ Model1.cs
[Column("ID")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column("LastName")]
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
[Column("FirstName")]
public string Prenom { get; set; }
public int Age { get; set; }
[MaxLength(10), MinLength(10)]
public string tel { get; set; }
public ICollection<Adresse> Adresses { get; set; }
public Personne(){Adresses = new List<Adresse>();}
}
23/11/2021 100
Code First
La migration
Mise en place de migrations
• Dans le menu Outils, aller dans Gestionnaire de package NuGet et sélectionner Console
du gestionnaire de paquet
Dans la console Console du Gestionnaire de Package
• Sélectionner le projet dans la liste Projet par defaut :
• Lancer la commande Enable-Migrations : ça génère un répertoire Migrations contenant un
fichier InitialCreate
• Lancer la commande Add-Migration add_column_tel_personne : ça génère un fichier
x_add_column_tel_personne.cs dans le répertoire Migrations
• Pour mettre à jour la base de données : lancer la commande Update-Database
Code First
La migration
Dans l’Explorateur d’Objet SQL Server
• Vérifier les mises à jour en allant dépliant la rubrique colonnes de la table Personne dans
Explorateur d’objets SQL Server
• Redémarrer si les changements n’apparaissent pas
23/11/2021 102
Code First
L’heritage
Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes
public class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}
Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes
Code First
L’heritage (Table per Hierarchy (TPH))
Dans le Main, on prépare les objets à persister
23/11/2021 106
Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes
Allons voir la base de données
23/11/2021 107
Code First
L’heritage (Table per Hierarchy (TPH)) : Une seule table pour les trois classes
Code First
L’heritage (Table per Concrete Class (TPC)) : Une table pour chaque classe concrète
public abstract class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] La classe Personne est
public int Id { get; set; } maintenant abstraite.
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}
[Table("Etudiant")]
public class Etudiant: Personne
{ On ajoute le décorateur [Table]
public int Bourse { get; set; } aux classes filles.
}
[Table("Enseignant")]
public class Enseignant: Personne
{
public int Salaire { get; set; }
}
23/11/2021 109
Code First
L’heritage (Table per Concrete Class (TPC)) : Une table pour chaque classe concrète
Code First
L’heritage (Table per Concrete Class (TPC))
Dans le Main, on prépare les objets à persister
23/11/2021 111
Code First
L’heritage (Table per Concrete Class (TPC)) : Une table pour chaque classe concrète
Allons voir la base de données
23/11/2021 112
Code First
L’heritage (Table per Type (TPT)): Une table indépendante pour chaque classe
public class Personne
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] La classe Personne
public int Id { get; set; } n’est plus abstraite.
[MaxLength(20),MinLength(2)]
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}
[Table("Etudiant")]
public class Etudiant: Personne
{ On ajoute le décorateur [Table]
public int Bourse { get; set; } aux classes filles.
}
[Table("Enseignant")]
public class Enseignant: Personne
{
public int Salaire { get; set; }
}
23/11/2021 113
Code First
L’heritage (Table per Type (TPT)): Une table indépendante pour chaque classe
Code First
L’heritage (Table per Type (TPT))
Dans le Main, on prépare les objets à persister
23/11/2021 115
Code First
L’heritage (Table per Type (TPT)): Une table indépendante pour chaque classe
Allons voir la base de données
23/11/2021 116
Database First
• Nous disposons d’une base de données
• Nous allons donc générer les entités qui correspondent au schema relationnel
existant
• Ensuite utiliser LINQ to Entities pour manipuler la base de données
Etapes à suivre:
• Création d’un projet Console
• Intégrer Entity Framework dans le projet
• Générer les entités
• Manipuler les données avec LINQ to Entities
23/11/2021 117
Database First
On va importer la base de donnees du premier model code first (Model1) avec la classe
personne et address.
• Clic droit sur le projet, Ajouter > Nouvel élément
• Dans Eléments Visual C#, cliquer sur Données et sélectionner ADO.NET Entity Data Model
• Saisir MonModele dans Nom puis Valider
• Choisir EF Designer à partir de la base de données
• Cliquer sur Nouvelle connexion
• Sélectionner Microsoft SQL Server puis cliquer sur Continuer
• Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB
• Cliquer sur le bouton radio Attacher un fichier de base de données, et sélectionner le
fichier .mdf portant le nom de la base de données précédente (situé dans
c:/utilisateurs/utilisateurCourant)
• Vérifier que la connexion avec la base de données est fonctionnelle en cliquant sur Tester la
connexion
23/11/2021 118
Database First
On va importer la base de données du premier model code first (Model1) avec la classe
personne et address.
• Cliquer sur Ok ensuite sur Suivant >
• Valider la copie du fichier dans le projet
• Déplier la rubrique Tables et sélectionner les tables à importer
• Cocher la case correspondante à la génération des noms en singulier et au pluriel
• Cliquer sur Terminer
Verifier que :
• Les entités ont bien été générées
• La classe MonModele (contexte) a été ajoutée aussi
23/11/2021 119
Database First
On va importer la base de données du premier model code first (Model1) avec la classe
personne et address.
• Cliquer sur Ok ensuite sur Suivant >
• Valider la copie du fichier dans le projet
• Déplier la rubrique Tables et sélectionner les tables à importer
• Cocher la case correspondante à la génération des noms en singulier et au pluriel
• Cliquer sur Terminer
Verifier que :
• Les entités ont bien été générées
• La classe MonModele (contexte) a été ajoutée aussi
23/11/2021 120
Database First
Dans le Main, on prépare les objets à persister
Model First
Model First
• Pas de base de données
• Pas d’entités
Solution
• On crée un modèle graphique (de classes)
• et on génère les entités et la base de données
23/11/2021 122
Model First
Etapes à suivre
• Création d’un projet Console
• Intégrer Entity Framework dans le projet
• Créer le modèle (créer des entités graphiquement)
• Générer la base de données
• Manipuler les données avec LINQ to Entities
23/11/2021 123
Model First
Pour créer le modèle
23/11/2021 124
Model First
Pour créer une entité
Model First
Autres opérations
23/11/2021 126
Model First
Pour générer la base de données
23/11/2021 127
Model First
La base de données n’existe pas
23/11/2021 128
Model First
Aller dans l’Explorateur d’Objet SQL Server
• Vérifier la création de la base de données
WCF
23/11/2021 130
Remarques
• Pas de Program.cs dans le projet, ni la méthode principale Main
• Présence de deux fichiers Service1.svc et IService1.cs
23/11/2021 132
WCF
Contenu du CompositeType
23/11/2021 134
WCF: Exemple
• On veut créer une méthode qui calcule la somme de deux entiers.
• Dans l’interface IService1 il faut ajouter
Testez !
23/11/2021 137
WCF : Exemple
Création d’un client d’un service WCF
23/11/2021 138
WCF : Exemple
Référencer le service dans le nouveau projet
23/11/2021 139
WCF : Exemple
Contenu du client
using ClientWCF.ServiceReference1;
namespace ClientWCF
{
class Program
{
static void Main(string[] args)
{
var client = new ServiceReference1.Service1Client();
int a = 7;
int b = 3;
int result = client.Somme(a, b);
Console.WriteLine($"la somme de {a} et {b} est {result}");
Console.ReadKey();
client.Close();
}
}
}
Etapes de mise en œuvre de WCF
• 1ère étape : Définition du contrat
On définit les signatures des méthodes composant le service WCF, et le format
des données à échanger.
• 2 ème étape : Implémentation du contrat
On implémente les services.
• 3ème étape : Configuration du service
On définit les EndPoints, c-à-d les points d’accès au service
• 4ème étape : Hébergement des services dans une application .NET
Puis, il ne reste plus qu’à créer une application cliente (quelque soit sa forme,
Windows, Web, …) qui pourra utiliser le service WCF
Les éléments A B C
• On commence :
• Créez une nouvelle solution, et un nouveau projet service WCF
• Dans le dossier App_Code renommez les fichiers Service et IService en
MonService et Icontrat
• Ouvrez les deux fichiers et modifiez-les
Exemple
namespace ProjetContrat L’interface qui a un
{ contrat de service
[ServiceContract]
public interface IContrat
{
[OperationContract]
string bonjour(string nom);
Méthodes exposées
[OperationContract] au travers du service
int somme(int a, int b); au client
[OperationContract]
double produitScalaire(Vecteur v1, Vecteur v2);
}
Exemple
namespace ProjetContrat Définition d’une classe
{
[DataContract]
public class Vecteur
{
[DataMember]
public double X { get; set; } Propriétés des classes
[DataMember]
public double Y { get; set; }
}
}
Etape 2: Implémentation du contrat
Le Service: Il s’agit d’une classe qui implémente le contrat, cette classe fournit
l’implémentation du service
public class MonService : IContrat
{
public int somme(int a, int b)
{
return a + b;
}
public string bonjour(string nom)
{ Testez les trois
return "bonjour " + nom; méthodes avec
} le simulateur
public double produitScalaire(Vecteur v1, Vecteur v2) client.
{
double r = (v1.X * v2.X) + (v1.Y * v2.Y);
return r;
}
}
23/11/2021 150
Application Cliente