58
C# : Entity Framework Achref El Mouelhi Docteur de l’universit ´ e d’Aix-Marseille Chercheur en Programmation par contrainte (IA) Ing ´ enieur en G ´ enie logiciel [email protected] Mai - Juin 2018, M2i Aix en Provence 2018 1 / 46

C# : Entity Framework - lsis.org · C# : Entity Framework Achref El Mouelhi Docteur de l’universite d’Aix-Marseille´ Chercheur en Programmation par contrainte (IA) Ingenieur

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

[email protected]

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

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