Upload
phamquynh
View
258
Download
6
Embed Size (px)
Citation preview
C# : Entity Framework
Achref El Mouelhi
Docteur de l’universite d’Aix-MarseilleChercheur en Programmation par contrainte (IA)
Ingenieur en Genie logiciel
Mai - Juin 2018, M2i Aix en Provence 2018 1 / 46
Plan
1 Introduction
2 Code First
3 Database First
4 Model First
Mai - Juin 2018, M2i Aix en Provence 2018 2 / 46
Introduction
Entity Framework
Entity Framework
ORM (Object Relational Mapping) officiel de .NET Framework
developpe par Microsoft en utilisant le langage C#
permettant de manipuler des objets C# et donc ne plus ecrire derequetes SQL dans nos codes
Autres ORM pour C#
NHibernate
PetaPOCO
Ces deux frameworks sont inspires par certains concepts javacomme le JavaBean
Mai - Juin 2018, M2i Aix en Provence 2018 3 / 46
Introduction
Entity Framework
Entity Framework
ORM (Object Relational Mapping) officiel de .NET Framework
developpe par Microsoft en utilisant le langage C#
permettant de manipuler des objets C# et donc ne plus ecrire derequetes SQL dans nos codes
Autres ORM pour C#
NHibernate
PetaPOCO
Ces deux frameworks sont inspires par certains concepts javacomme le JavaBean
Mai - Juin 2018, M2i Aix en Provence 2018 3 / 46
Introduction
Entity Framework
ORM
Un programme informatique qui joue le role d’un traducteur entrele monde relationnel et le monde objet
L’objectif est de ne plus ecrire des requetes SQL dans les classes
Dans les ORM, il y a deux composants :
Les entites (des classes a implementer par le developpeur) : quirepresentent certaines tables
Le gestionnaire d’entites (une classe qui existe deja) : a utiliserpour persister les entites dans la base de donnees
Mai - Juin 2018, M2i Aix en Provence 2018 4 / 46
Introduction
Entity Framework
Dans le cas d’Entity Framework
Les entites : des classes decorees
Le gestionnaire d’entites : Linq to Entities
Mai - Juin 2018, M2i Aix en Provence 2018 5 / 46
Introduction
Entity Framework
Trois approches
Code First : on cree les entites puis et Visual Studio genere labase de donnees
Database First : on cree la base de donnees (ou on a unebase de donnees qui existe deja) et Visual Studio genere nosentites a partir de cette base de donnees
Model First : on cree notre modele (de classe) et Visual Studiogenere la base de donnees et les entites correspondantes
Mai - Juin 2018, M2i Aix en Provence 2018 6 / 46
Code First
Entity Framework
Etapes a suivre
Creation d’un projet Console
Integrer Entity Framework dans le projet
Preparer le contexte Code First
Creer les entites
Generer la base de donnees et manipuler les donnees avec SQLto Entities
Mai - Juin 2018, M2i Aix en Provence 2018 7 / 46
Code First
Entity Framework
Pour integrer Entity Framework dans le projet, on utilise NuGet.
NuGet
Un gestionnaire de paquets, par defaut, pour .NET Framework
Open-source et gratuit
inclus dans Visual Studio depuis 2012
utilisable aussi en ligne de commande
Mai - Juin 2018, M2i Aix en Provence 2018 8 / 46
Code First
Entity Framework
Pour integrer Entity Framework dans le projet, on utilise NuGet.
NuGet
Un gestionnaire de paquets, par defaut, pour .NET Framework
Open-source et gratuit
inclus dans Visual Studio depuis 2012
utilisable aussi en ligne de commande
Mai - Juin 2018, M2i Aix en Provence 2018 8 / 46
Code First
Entity Framework
Utiliser NuGet pour referencer Entity Framework
Un clic droit sur References dans l’Explorateur desolution
Choisir Gerer les packages NuGet
Aller dans l’onglet Parcourir et chercher Entity Framework
Choisir la derniere version stable et installer
Accepter, attendre la fin de l’installation et aller verifier dans larubrique References l’ajout des packages relatifs a EntityFramework
Mai - Juin 2018, M2i Aix en Provence 2018 9 / 46
Code First
Entity Framework
Preparons le contexte Code First
Clic droit sur le projet, Ajouter > Nouvel element
Dans Elements Visual C#, cliquer sur Donnees etselectionner ADO.NET Entity Data Model
Valider
Choisir Modele vide Code First et cliquer sur Terminer
Un fichier Model1.cs a ete cree
Mai - Juin 2018, M2i Aix en Provence 2018 10 / 46
Code First
Entity Framework
Contenu initial de Model1.cs
public class Model1 : DbContext{
public Model1(): base("name=Model1")
{}
}
Dans ce fichier, on ajoute les entites qu’on va creer
Mai - Juin 2018, M2i Aix en Provence 2018 11 / 46
Code First
Entity Framework
Contenu initial de Model1.cs
public class Model1 : DbContext{
public Model1(): base("name=Model1")
{}
}
Dans ce fichier, on ajoute les entites qu’on va creer
Mai - Juin 2018, M2i Aix en Provence 2018 11 / 46
Code First
Entity Framework
Creons une premiere entite personne dans un repertoire Model
public class Personne{
public int Id { get; set; }public string Nom { get; set; }public string Prenom { get; set; }public int Age { get; set; }
}
Et si on veut en dire plus? sur la cle primaire, un nom different pour latable et/ou les colonnes...
Solution : utiliser les decorateurs (annotations)
Mai - Juin 2018, M2i Aix en Provence 2018 12 / 46
Code First
Entity Framework
Creons une premiere entite personne dans un repertoire Model
public class Personne{
public int Id { get; set; }public string Nom { get; set; }public string Prenom { get; set; }public int Age { get; set; }
}
Et si on veut en dire plus? sur la cle primaire, un nom different pour latable et/ou les colonnes...
Solution : utiliser les decorateurs (annotations)
Mai - Juin 2018, M2i Aix en Provence 2018 12 / 46
Code First
Entity Framework
Creons une premiere entite personne dans un repertoire Model
public class Personne{
public int Id { get; set; }public string Nom { get; set; }public string Prenom { get; set; }public int Age { get; set; }
}
Et si on veut en dire plus? sur la cle primaire, un nom different pour latable et/ou les colonnes...
Solution : utiliser les decorateurs (annotations)
Mai - Juin 2018, M2i Aix en Provence 2018 12 / 46
Code First
Entity FrameworkCreons une premiere entite personne
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; }
}
Mai - Juin 2018, M2i Aix en Provence 2018 13 / 46
Code First
Entity Framework
Explication
[Table("personnes")] : indique que la table correspondantea cette entite sera nommee personnes
[Column("ID")] : permet d’avoir un nom de colonne (ID)different de celui de l’attribut
[Key] : indique que cet attribut correspond a la cle primaire de latable
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] :precise que la cle primaire est Auto-Increment (autres valeurspossibles : None et Computed)
[MaxLength(20),MinLength(2)] : indique la longueur maxet min de la chaıne de caractere
Mai - Juin 2018, M2i Aix en Provence 2018 14 / 46
Code First
Entity Framework
Autres decorateurs
[NotMapped] : indique que l’attribut sera utilise seulementniveau applicatif et qu’il n’aura pas de correspondance dans labase de donnees
[Required] : precise que cette colonne ne prend pas la valeurnull
[ForeignKey("nomColonneTableOrigine")] : indique quecet attribut provient d’une autre table et fait reference au nom dela cle etrangere
...
Mai - Juin 2018, M2i Aix en Provence 2018 15 / 46
Code First
Entity Framework
Attentions aux types
Entity Framework ne supporte pas certains types C# tels quechar...
La liste des types compatibles :https://www.devart.com/dotconnect/db2/docs/DataTypeMapping.html
Mai - Juin 2018, M2i Aix en Provence 2018 16 / 46
Code First
Entity FrameworkExemple avec une cle primaire composee et une cle etrangere
public class Adresse{
[Key][Column(Order=1)]public int Rue { get; set; }
[Key][Column(Order=2)]public string Ville{ get; set; }
[Key][Column(Order=3)]public string CodeP{ get; set; }
[ForeignKey("Personne")]public int PersonneId { get; set; }public Personne Personne { get; set; }
}
Mai - Juin 2018, M2i Aix en Provence 2018 17 / 46
Code First
Entity FrameworkOn peut faire aussi
public class Adresse{
[Key][Column(Order=1)]public int Rue { get; set; }
[Key][Column(Order=2)]public string Ville{ get; set; }
[Key][Column(Order=3)]public string CodeP{ get; set; }
public int PersonneId { get; set; }[ForeignKey("PersonneId")]public Personne Personne { get; set; }
}
Mai - Juin 2018, M2i Aix en Provence 2018 18 / 46
Code First
Entity FrameworkEt pour que ca soit bidirectionnelle
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; }
public ICollection<Adresse> Adresses { get; set; }}
Mai - Juin 2018, M2i Aix en Provence 2018 19 / 46
Code First
Entity Framework
Proprietes de navigation
public ICollection<Adresse> Adresses { get; set;} de l’entite Personne, et
public Personne Personne { get; set; } de l’entiteAdresse
s’appellent proprietes de navigation : elles nous permettent derecuperer respectivement la liste d’adresses d’une personne et lapersonne proprietaire d’une personne
Mai - Juin 2018, M2i Aix en Provence 2018 20 / 46
Code First
Entity Framework
N’oublions pas d’ajouter
public Personne(){
Adresses = new List<Adresse>();}
Mai - Juin 2018, M2i Aix en Provence 2018 21 / 46
Code First
Entity Framework
Mettons a jour la classe Model1.cs
using Model;
public class Model1 : DbContext{
public Model1(): base("name=Model1")
{}public virtual DbSet<Personne> Personnes {
get; set; }public virtual DbSet<Adresse> Adresses { get
; set; }}
Mai - Juin 2018, M2i Aix en Provence 2018 22 / 46
Code First
Entity FrameworkDans le Main, on prepare les objets a persister
using(var model = new Model1()){
var adresse = new Adresse{
Rue = 32,Ville = "Marseille",CodeP = "13015"
};var personne = new Personne(){
Nom = "Ernest",Prenom = "Jacques",Age = 45
};personne.Adresses.Add(adresse);
L’utilisation de Using permet d’automatiser plusieurs operations telle que lafermeture de la connexion...
Mai - Juin 2018, M2i Aix en Provence 2018 23 / 46
Code First
Entity Framework
Dans le Main, on prepare les objets a persister
// on persiste la personnemodel.Personnes.Add(personne);model.SaveChanges();// on recupere le contenu de l’entity Personnevar persoQuery = from perso in model.Personnes
select perso;// on affiche la personne ainsi que sa premiere
adresseforeach(var elt in persoQuery)
Console.WriteLine($"Bonjour {elt.Prenom} {elt.Nom} de {elt.Adresses.First<Adresse>().Ville}");
}Console.ReadKey();
Erreur : il ne trouve pas d’adresse pour cette personne, et pourtant, si onverifie la base de donnees, l’adresse a bien ete ajoutee.
Mai - Juin 2018, M2i Aix en Provence 2018 24 / 46
Code First
Entity Framework
Dans le Main, on prepare les objets a persister
// on persiste la personnemodel.Personnes.Add(personne);model.SaveChanges();// on recupere le contenu de l’entity Personnevar persoQuery = from perso in model.Personnes
select perso;// on affiche la personne ainsi que sa premiere
adresseforeach(var elt in persoQuery)
Console.WriteLine($"Bonjour {elt.Prenom} {elt.Nom} de {elt.Adresses.First<Adresse>().Ville}");
}Console.ReadKey();
Erreur : il ne trouve pas d’adresse pour cette personne, et pourtant, si onverifie la base de donnees, l’adresse a bien ete ajoutee.
Mai - Juin 2018, M2i Aix en Provence 2018 24 / 46
Code First
Entity Framework
Pour faire la modification
var personToBeDeleted =(from p in model.Personneswhere p.Nom.Equals("Ernest")select p).First();
personToBeDeleted.Prenom = "Michel";model.SaveChanges();
Et pour la suppression
Personne p2 = model.Personnes.First(perso => perso.Id == 1);
model.Personnes.Remove(p2);model.SaveChanges();
Mai - Juin 2018, M2i Aix en Provence 2018 25 / 46
Code First
Entity Framework
Explication
Par defaut, Entity Framework , comme la plupart des ORM,ne charge pas les entites liees.
Mais, on peut lui demander de le faire en ajoutant le mot clevirtual (rien a voir avec virtual utiliser pour la redefinition demethodes)
public class Personne{
// ...public virtual ICollection<Adresse> Adresses {
get; set; }}
Mai - Juin 2018, M2i Aix en Provence 2018 26 / 46
Code First
Entity Framework
Explication
Par defaut, Entity Framework , comme la plupart des ORM,ne charge pas les entites liees.
Mais, on peut lui demander de le faire en ajoutant le mot clevirtual (rien a voir avec virtual utiliser pour la redefinition demethodes)
public class Personne{
// ...public virtual ICollection<Adresse> Adresses {
get; set; }}
Mai - Juin 2018, M2i Aix en Provence 2018 26 / 46
Code First
Entity Framework
Pour verifier niveau base de donnees
Aller dans le menu Affichage et cliquer sur Explorateurd’objets SQL Server
Etendre la rubrique SQL Server
Chercher la base de donnees et verifier l’existence des deuxtables
Mai - Juin 2018, M2i Aix en Provence 2018 27 / 46
Code First
Entity Framework
Et si on veut ajouter une nouvelle colonne dans une table? (oumodifier la table d’une maniere plus generale)
Faut-il supprimer la base de donnees?
Ensuite modifier l’entite
Regenerer la base de donnees
Cela veut dire perdre toutes les donnees
Une autre solution
Utiliser la migration Code First
Mai - Juin 2018, M2i Aix en Provence 2018 28 / 46
Code First
Entity Framework
Et si on veut ajouter une nouvelle colonne dans une table? (oumodifier la table d’une maniere plus generale)
Faut-il supprimer la base de donnees?
Ensuite modifier l’entite
Regenerer la base de donnees
Cela veut dire perdre toutes les donnees
Une autre solution
Utiliser la migration Code First
Mai - Juin 2018, M2i Aix en Provence 2018 28 / 46
Code First
Entity Framework
Ajoutons l’attribut sexe dans la classe Personne
public class Personne{
// ...[MaxLength(1), MinLength(1)]public string Sexe { get; set; }// ...
}
Mai - Juin 2018, M2i Aix en Provence 2018 29 / 46
Code First
Entity Framework
Mise en place de migrations
Dans le menu Outils, aller dans Gestionnaire de packageNuGet et selectionner Console du gestionnaire de paquet
Dans la console Console du Gestionnaire de Package
Lancer la commande Enable-Migrations : ca genere unrepertoire Migrations contenant un fichier InitialCreate
Lancer la commande Add-Migrationadd column sexe personne : ca genere un fichierx add column sexe personne.cs dans le repertoireMigrations
Pour mettre a jour la base de donnees : lancer la commandeUpdate-Database
Mai - Juin 2018, M2i Aix en Provence 2018 30 / 46
Code First
Entity Framework
Mise en place de migrations
Dans le menu Outils, aller dans Gestionnaire de packageNuGet et selectionner Console du gestionnaire de paquet
Dans la console Console du Gestionnaire de Package
Lancer la commande Enable-Migrations : ca genere unrepertoire Migrations contenant un fichier InitialCreate
Lancer la commande Add-Migrationadd column sexe personne : ca genere un fichierx add column sexe personne.cs dans le repertoireMigrations
Pour mettre a jour la base de donnees : lancer la commandeUpdate-Database
Mai - Juin 2018, M2i Aix en Provence 2018 30 / 46
Code First
Entity Framework
Aller dans l’Explorateur d’Objet SQL Server
Verifier les mises a jour
Mai - Juin 2018, M2i Aix en Provence 2018 31 / 46
Database First
Entity Framework
Database First
Nous disposons d’une base de donnees
Nous allons donc generer les entites qui correspondent auschema relationnel existant
Ensuite utiliser Linq to entities pour manipuler la base dedonnees
Mai - Juin 2018, M2i Aix en Provence 2018 32 / 46
Database First
Entity Framework
Etapes a suivre
Creation d’un projet Console
Integrer Entity Framework dans le projet
Generer les entites
Manipuler les donnees avec SQL to Entities
Mai - Juin 2018, M2i Aix en Provence 2018 33 / 46
Database First
Entity Framework
La base de donnees existe (celle du projet precedent), on va l’importer
Clic droit sur le projet, Ajouter > Nouvel element
Dans Elements Visual C#, cliquer sur Donnees etselectionner ADO.NET Entity Data Model
Saisir MonModele dans Nom :
Valider
Choisir Code First a partir de la base de donnees etcliquer sur Suivant > (On peut aussi choisir EF Designer apartir de la base de donnees)
Cliquer sur Nouvelle connexion
Mai - Juin 2018, M2i Aix en Provence 2018 34 / 46
Database First
Entity Framework
Etablir la connexion avec la base de donnees
Cliquer sur le bouton Modifier pour modifier la source dedonnees
Selectionner Microsoft SQL Server puis cliquer sur Ok
Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB
Cliquer sur le bouton radio Attacher un fichier de basede donnees, et selectionner le fichier .mdf portant le nom de labase de donnees precedentes et situe dansc:/utilisateurs/utilisateurCourant
Verifier que la connexion avec la base de donnees peut etreetablie en cliquant sur Tester la connexion
Mai - Juin 2018, M2i Aix en Provence 2018 35 / 46
Database First
Entity Framework
Ensuite
Cliquer sur Ok ensuite sur Suivant >
Valider la copie du fichier dans le projet
Etendre la rubrique Tables et selectionner les tables a importer
Cliquer sur Terminer
Mai - Juin 2018, M2i Aix en Provence 2018 36 / 46
Database First
Entity Framework
C’est fini, verifier que
les entites ont bien ete generees
la classe MonModele (contexte) a ete ajoutee aussi
Verifier aussi
les noms de classes, objets dans tous les fichiers, y comprisMonModele, respectent les conventions, sinon, modifier les.
Mai - Juin 2018, M2i Aix en Provence 2018 37 / 46
Database First
Entity Framework
C’est fini, verifier que
les entites ont bien ete generees
la classe MonModele (contexte) a ete ajoutee aussi
Verifier aussi
les noms de classes, objets dans tous les fichiers, y comprisMonModele, respectent les conventions, sinon, modifier les.
Mai - Juin 2018, M2i Aix en Provence 2018 37 / 46
Database First
Entity Framework
Dans le Main, on prepare les objets a persister
using (var db = new MonModele()){
var adresse = new Adresse{
Rue = 13,Ville = "Lyon",CodeP = "69007"
};var personne = new Personne(){
Nom = "Jeavons",Prenom = "Jacob",Age = 35
};personne.Adresses.Add(adresse);
Mai - Juin 2018, M2i Aix en Provence 2018 38 / 46
Database First
Entity Framework
Dans le Main, on prepare les objets a persister
personne.Adresses.Add(adresse);db.Personnes.Add(personne);db.SaveChanges();
var persoQuery = from perso in db.Personnesselect perso;
foreach (var elt in persoQuery)Console.WriteLine($"Bonjour {elt.FirstName}
{elt.LastName} de {elt.Adresses.First<Adresse>().Ville}");
Mai - Juin 2018, M2i Aix en Provence 2018 39 / 46
Model First
Entity Framework
Model First
Pas de base de donnees
Pas d’entites
Solution
On cree un modele graphique (de classes)
et on genere les entites et la base de donnees
Mai - Juin 2018, M2i Aix en Provence 2018 40 / 46
Model First
Entity Framework
Model First
Pas de base de donnees
Pas d’entites
Solution
On cree un modele graphique (de classes)
et on genere les entites et la base de donnees
Mai - Juin 2018, M2i Aix en Provence 2018 40 / 46
Model First
Entity Framework
Etapes a suivre
Creation d’un projet Console
Integrer Entity Framework dans le projet
Creer le modele (creer des entites graphiquement)
Generer la base de donnees
Manipuler les donnees avec SQL to Entities
Mai - Juin 2018, M2i Aix en Provence 2018 41 / 46
Model First
Entity Framework
Pour creer le modele
Clic droit sur le projet, Ajouter > Nouvel element
Dans Elements Visual C#, cliquer sur Donnees etselectionner ADO.NET Entity Data Model
Saisir MonModele dans Nom :
Valider
Choisir Modele vide EF Designer et cliquer sur Terminer
Mai - Juin 2018, M2i Aix en Provence 2018 42 / 46
Model First
Entity Framework
Cliquer sur la boıte a outils (a gauche)
Pour creer une entite : soit double clic sur entite, soit un clic surentite et la glisser dans le panneau central (creons deux entitesPersonne et Adresse)Pour ajouter un attribut : clic droit sur l’entite et aller dansAjouter nouveau > Propriete scalaire. Par defaut,l’attribut est de type String. Pour changer, aller dans le panneauProprietes
Pour declarer une cle compose, selectionner les champsconcernes et aller dans le panneau Proprietes et mettre aTrue la propriete Cle primaire
Pour creer une association, clic droit dans le panneau centralensuite aller dans Ajouter nouveau > Association,renseigner les multiplicites (* *) et les proprietes de navigations(Adresses Dans Personne et Personnes dans Adresse) et valider.
Mai - Juin 2018, M2i Aix en Provence 2018 43 / 46
Model First
Entity FrameworkPour generer la base de donnees
Clic droit sur le panneau central et selectionner Generer labase de donnees a partir du modele
Cliquer sur Nouvelle connexion
Cliquer sur le bouton Modifier pour modifier la source dedonnees
Selectionner Microsoft SQL Server puis cliquer sur Ok
Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB
Dans Selectionner ou entrer un nom d’une base dedonnees, saisir DatabaseFromModel (par exemple)
Cliquer sur OKMai - Juin 2018, M2i Aix en Provence 2018 44 / 46
Model First
Entity Framework
La base de donnees n’existe pas
Il faut donc demander a EF de la creer
Cliquer sur Suivant >
Un script SQL (DDL) permettant de creer la base de donnees estgenere
Cliquer sur Terminer
Pour creer la base de donnees, clic droit sur le script et choisirExecute
Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB
Cliquer sur Se connecter
Mai - Juin 2018, M2i Aix en Provence 2018 45 / 46
Model First
Entity Framework
Aller dans l’Explorateur d’Objet SQL Server
Verifier la creation de la base de donnees
Aller dans l’Explorateur de solutions
Verifier l’existence de deux entites
Verifier la creation de la classe contexte
Mai - Juin 2018, M2i Aix en Provence 2018 46 / 46