0% ont trouvé ce document utile (0 vote)
0 vues91 pages

EntityFramework

Ce document présente Entity Framework, un ORM développé par Microsoft pour le .NET Framework, permettant de manipuler des objets C# sans écrire de requêtes SQL. Il décrit les trois approches de développement : Code First, Database First et Model First, ainsi que les étapes pour intégrer Entity Framework dans un projet. Le document aborde également la création d'entités, les relations entre celles-ci, et l'utilisation de décorateurs pour définir des propriétés spécifiques des entités.

Transféré par

amel.triki.iset
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
0 vues91 pages

EntityFramework

Ce document présente Entity Framework, un ORM développé par Microsoft pour le .NET Framework, permettant de manipuler des objets C# sans écrire de requêtes SQL. Il décrit les trois approches de développement : Code First, Database First et Model First, ainsi que les étapes pour intégrer Entity Framework dans un projet. Le document aborde également la création d'entités, les relations entre celles-ci, et l'utilisation de décorateurs pour définir des propriétés spécifiques des entités.

Transféré par

amel.triki.iset
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

C# : Entity Framework

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en Programmation par contrainte (IA)
Ingénieur en Génie logiciel

[Link]@[Link]

Mai - Juin 2018, M2i Aix en Provence 2018 1 / 76


Plan

1 Introduction

2 Code First
Les relations entre entités
Les relations bidirectionnelles
Le chargement lazy
La migration
L’héritage

3 Database First

4 Model First

Mai - Juin 2018, M2i Aix en Provence 2018 2 / 76


Introduction

Entity Framework

Entity Framework

ORM (Object Relational Mapping) officiel de .NET Framework


développé par Microsoft en utilisant le langage C#
permettant de manipuler des objets C# et donc de ne plus écrire
de requêtes SQL dans nos codes

Mai - Juin 2018, M2i Aix en Provence 2018 3 / 76


Introduction

Entity Framework

Entity Framework

ORM (Object Relational Mapping) officiel de .NET Framework


développé par Microsoft en utilisant le langage C#
permettant de manipuler des objets C# et donc de ne plus écrire
de requêtes SQL dans nos codes

Autres ORM pour C#


NHibernate
PetaPOCO
Ces deux frameworks sont inspirés par certains concepts java
comme le JavaBean

Mai - Juin 2018, M2i Aix en Provence 2018 3 / 76


Introduction

Entity Framework

ORM
Un programme informatique qui joue le rôle d’un traducteur entre
le monde relationnel et le monde objet
L’objectif : plus de requêtes SQL dans les classes
Dans les ORM, il y a deux composants :
Les entités (des classes à implémenter par le développeur) : qui
représentent certaines tables
Le gestionnaire d’entités (une classe qui existe déjà) : à utiliser
pour persister les entités dans la base de données

Mai - Juin 2018, M2i Aix en Provence 2018 4 / 76


Introduction

Entity Framework

Dans le cas d’Entity Framework


Les entités : des classes décorées (annotées)
Le gestionnaire d’entités : Linq to Entities

Mai - Juin 2018, M2i Aix en Provence 2018 5 / 76


Introduction

Entity Framework

Trois approches

Code First : on crée les entités puis et 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éjà) et Visual Studio génère nos
entités à 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

Mai - Juin 2018, M2i Aix en Provence 2018 6 / 76


Introduction

Entity Framework

Avant de commencer
Créer une nouvelle solution pour ce chapitre
Créer un projet pour chaque exemple

Mai - Juin 2018, M2i Aix en Provence 2018 7 / 76


Code First

Entity Framework

Étapes à 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

Mai - Juin 2018, M2i Aix en Provence 2018 8 / 76


Code First

Entity Framework

Pour intégrer Entity Framework dans le projet, on utilise NuGet.

Mai - Juin 2018, M2i Aix en Provence 2018 9 / 76


Code First

Entity Framework

Pour intégrer Entity Framework dans le projet, on utilise NuGet.

NuGet
Un gestionnaire de paquets, par défaut, 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 9 / 76


Code First

Entity Framework

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

Mai - Juin 2018, M2i Aix en Provence 2018 10 / 76


Code First

Entity Framework

Préparons le contexte Code First


Clic droit sur le projet, Ajouter > Nouvel élément
Dans Éléments Visual C#, cliquer sur Données et
sélectionner [Link] Entity Data Model
Valider
Choisir Modèle vide Code First et cliquer sur Terminer

Un fichier [Link] a été créé

Mai - Juin 2018, M2i Aix en Provence 2018 11 / 76


Code First

Entity Framework

Contenu initial de [Link]


public class Model1 : DbContext
{
public Model1()
: base("name=Model1")
{
}
}

Mai - Juin 2018, M2i Aix en Provence 2018 12 / 76


Code First

Entity Framework

Contenu initial de [Link]


public class Model1 : DbContext
{
public Model1()
: base("name=Model1")
{
}
}

Dans ce fichier, on ajoute les entités qu’on va créer

Mai - Juin 2018, M2i Aix en Provence 2018 12 / 76


Code First

Entity Framework

Créons une première entité personne dans un répertoire Model


public class Personne
{
public int Id { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 13 / 76


Code First

Entity Framework

Créons une première entité personne dans un répertoire Model


public class Personne
{
public int Id { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}

Si on veut en dire plus ? sur la clé primaire, un nom différent pour la


table et/ou les colonnes...

Mai - Juin 2018, M2i Aix en Provence 2018 13 / 76


Code First

Entity Framework

Créons une première entité personne dans un répertoire Model


public class Personne
{
public int Id { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public int Age { get; set; }
}

Si on veut en dire plus ? sur la clé primaire, un nom différent pour la


table et/ou les colonnes...

Solution : utiliser les décorateurs (annotations)

Mai - Juin 2018, M2i Aix en Provence 2018 13 / 76


Code First

Entity Framework
Créons une première entité Personne
using [Link];
using [Link];
[Table("personnes")]
public class Personne
{
[Column("ID")]
[Key]
[DatabaseGenerated([Link])]
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 14 / 76


Code First

Entity Framework

Explication

[Table("personnes")] : indique que la table correspondante à 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([Link])] :
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


chaı̂ne de caractère

Mai - Juin 2018, M2i Aix en Provence 2018 15 / 76


Code First

Entity Framework

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([Link])] : précise un type spécifique d’un attribut :


Password, Date...

[Order] : doit être utilisé avec [Key] lorsque la clé primaire est composée

...

Mai - Juin 2018, M2i Aix en Provence 2018 16 / 76


Code First

Entity Framework

Attentions aux types

Entity Framework ne supporte pas certains types C# tels que


char...
La liste des types compatibles :
[Link]
/[Link]

Mai - Juin 2018, M2i Aix en Provence 2018 17 / 76


Code First

Entity Framework

Mettons à jour la classe [Link]


using Model;

public class Model1 : DbContext


{
public Model1()
: base("name=Model1")
{
}
public virtual DbSet<Personne> Personnes {
get; set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 18 / 76


Code First

Entity Framework
Dans le Main, on prépare les objets à persister
using(var model = new Model1())
{
var personne = new Personne()
{
Nom = "Pradel",
Prenom = "Jacques",
Age = 45
};

// on persiste la personne
[Link](personne);
[Link]();

// on récupère le contenu de l’entité Personne


var persoQuery = from perso in [Link]
select perso;

// on affiche la personne
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { [Link] }");
}
[Link]();
Mai - Juin 2018, M2i Aix en Provence 2018 19 / 76
Code First Les relations entre entités

Entity Framework

Considérons toujours l’entité Personne

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; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 20 / 76


Code First Les relations entre entités

Entity Framework
Considérons une entité avec une clé primaire composée et une clé étrangère

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; }


public Personne Personne { get; set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 21 / 76


Code First Les relations entre entités

Entity Framework

Mettons à jour la classe [Link]


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 / 76


Code First Les relations entre entités

Entity Framework
Dans le Main, on prépare les objets à persister
using(var model = new Model1())
{
var personne = new Personne()
{
Nom = "Pradel",
Prenom = "Jacques",
Age = 45
};

var adresse = new Adresse


{
Rue = 32,
Ville = "Marseille",
CodeP = "13015",
Personne = personne;
};

Mai - Juin 2018, M2i Aix en Provence 2018 23 / 76


Code First Les relations entre entités

Entity Framework

Ensuite, on persiste les données


// on persiste les données
[Link](adresse);
[Link]();

// on récupère le contenu de l’entité Personne


var persoQuery = from perso in [Link]
select perso;

// on affiche les personnes


foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom }");
}
[Link]();

Mai - Juin 2018, M2i Aix en Provence 2018 24 / 76


Code First Les relations entre entités

Entity Framework

Deux tables ont été créées


Personne avec les colonnes Id, Nom, Prénom et Age
Étudiant avec les colonnes Rue, Ville, CodeP et Id (une clé
étrangère correspondant à l’identifiant d’une Personne)

Mai - Juin 2018, M2i Aix en Provence 2018 25 / 76


Code First Les relations entre entités

Entity Framework
Pour attribuer un nom à la clé étrangère différent de celui dans la table d’origine
(ici PersonneId)
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 26 / 76
Code First Les relations entre entités

Entity Framework
On peut aussi faire
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 27 / 76


Code First Les relations bidirectionnelles

Entity Framework

Remarques

Pour une adresse donnée, on peut facilement connaı̂tre 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

Mai - Juin 2018, M2i Aix en Provence 2018 28 / 76


Code First Les relations bidirectionnelles

Entity Framework

Pour que ça soit bidirectionnelle


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; }

public ICollection<Adresse> Adresses { get; set; }


}

Mai - Juin 2018, M2i Aix en Provence 2018 29 / 76


Code First Les relations bidirectionnelles

Entity Framework

Propriétés de navigation

public ICollection<Adresse> Adresses { get; set;


} de l’entité Personne, et
public Personne Personne { get; set; } de l’entité
Adresse
s’appellent propriétés de navigation : elles nous permettent de
récupérer respectivement la liste d’adresses d’une personne et la
personne propriétaire d’une personne

Mai - Juin 2018, M2i Aix en Provence 2018 30 / 76


Code First Les relations bidirectionnelles

Entity Framework

N’oublions pas d’ajouter


public Personne()
{
Adresses = new List<Adresse>();
}

Mai - Juin 2018, M2i Aix en Provence 2018 31 / 76


Code First Les relations bidirectionnelles

Entity Framework

Mettons à jour la classe [Link]


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 32 / 76


Code First Les relations bidirectionnelles

Entity Framework
Dans le Main, on prépare les objets à persister
using(var model = new Model1())
{
var adresse = new Adresse
{
Rue = 32,
Ville = "Marseille",
CodeP = "13015"
};
var personne = new Personne()
{
Nom = "Pradel",
Prenom = "Jacques",
Age = 45
};
[Link](adresse);

Mai - Juin 2018, M2i Aix en Provence 2018 33 / 76


Code First Les relations bidirectionnelles

Entity Framework

Dans le Main, on prépare les objets à persister


// on persiste la personne
[Link](personne);
[Link]();
// on récupère le contenu de l’entité Personne
var persoQuery = from perso in [Link]
select perso;
// on affiche la personne ainsi que sa première
adresse
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom } de { [Link]<Adresse>().Ville
}");
}
[Link]();

Mai - Juin 2018, M2i Aix en Provence 2018 34 / 76


Code First Les relations bidirectionnelles

Entity Framework
Pour faire la modification
var personToBeUpdated =
(from p in [Link]
where [Link]("Pradel")
select p).First();

[Link] = "Michel";
[Link]();

Et pour la suppression
Personne p2 = [Link](perso => perso.
Id == 1);
[Link](p2);
[Link]();

Mai - Juin 2018, M2i Aix en Provence 2018 35 / 76


Code First Le chargement lazy

Entity Framework

Explication

Par défaut, Entity Framework , comme la plupart des ORM,


ne charge pas les entités liées.
Mais, on peut lui demander de le faire en ajoutant le mot clé
virtual (rien à voir avec virtual utiliser pour la redéfinition de
méthodes)

Mai - Juin 2018, M2i Aix en Provence 2018 36 / 76


Code First Le chargement lazy

Entity Framework

Explication

Par défaut, Entity Framework , comme la plupart des ORM,


ne charge pas les entités liées.
Mais, on peut lui demander de le faire en ajoutant le mot clé
virtual (rien à voir avec virtual utiliser pour la redéfinition de
méthodes)

public class Personne


{
// ...
public virtual ICollection<Adresse> Adresses {
get; set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 36 / 76


Code First Le chargement lazy

Entity Framework

Pour vérifier niveau base de données


Aller dans le menu Affichage et cliquer sur Explorateur
d’objets SQL Server
Étendre la rubrique SQL Server
Chercher la base de données et vérifier l’existence des deux
tables

Mai - Juin 2018, M2i Aix en Provence 2018 37 / 76


Code First La migration

Entity Framework

Si on veut ajouter une nouvelle colonne dans une table ? (ou modifier
la table d’une manière plus générale)

Faut-il supprimer la base de données ?


Ensuite modifier l’entité
Régénérer la base de données
Cela veut dire perdre toutes les données

Mai - Juin 2018, M2i Aix en Provence 2018 38 / 76


Code First La migration

Entity Framework

Si on veut ajouter une nouvelle colonne dans une table ? (ou modifier
la table d’une manière plus générale)

Faut-il supprimer la base de données ?


Ensuite modifier l’entité
Régénérer la base de données
Cela veut dire perdre toutes les données

Une autre solution


Utiliser la migration Code First

Mai - Juin 2018, M2i Aix en Provence 2018 38 / 76


Code First La migration

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 39 / 76


Code First La migration

Entity Framework
Mise en place de migrations

Dans le menu Outils, aller dans Gestionnaire de package NuGet et


sélectionner Console du gestionnaire de paquet

Mai - Juin 2018, M2i Aix en Provence 2018 40 / 76


Code First La migration

Entity Framework
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 défaut :

Lancer la commande Enable-Migrations : ça génère un répertoire


Migrations contenant un fichier InitialCreate

Lancer la commande Add-Migration


add column sexe personne : ça génère un fichier
x add column sexe [Link] dans le répertoire Migrations

Pour mettre à jour la base de données : lancer la commande


Update-Database

Mai - Juin 2018, M2i Aix en Provence 2018 40 / 76


Code First La migration

Entity Framework

Aller 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

Mai - Juin 2018, M2i Aix en Provence 2018 41 / 76


Code First L’héritage

Entity Framework

Supposant que l’on a

une classe mère Personne

deux classes filles Etudiant et Enseignant qui étendent Personne

Mai - Juin 2018, M2i Aix en Provence 2018 42 / 76


Code First L’héritage

Entity Framework

Supposant que l’on a

une classe mère Personne

deux classes filles Etudiant et Enseignant qui étendent Personne

Comment transformer ça en tables ? (3 Solutions possibles)

Une seule table pour les trois classes : Table per Hierarchy (TPH)

Une table pour chaque classe concrète : Table per Concrete Class
(TPC)

Une table indépendante pour chaque classe : Table per Type (TPT)

Mai - Juin 2018, M2i Aix en Provence 2018 42 / 76


Code First L’héritage

Entity Framework

Table per Hierarchy : commençons par créer l’entité Personne


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; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 43 / 76


Code First L’héritage

Entity Framework

Créons l’entité Etudiant


public class Etudiant: Personne
{
public int Bourse { get; set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 44 / 76


Code First L’héritage

Entity Framework

Créons l’entité Etudiant


public class Etudiant: Personne
{
public int Bourse { get; set; }
}

Et l’entité Enseignant
public class Enseignant: Personne
{
public int Salaire { get; set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 44 / 76


Code First L’héritage

Entity Framework

Mettons à jour la classe [Link]


public class Model1 : DbContext
{
public Model1()
: base("name=Model1")
{
}
public virtual DbSet<Personne> Personnes { get; set;
}
public virtual DbSet<Etudiant> Etudiants { get; set;
}
public virtual DbSet<Enseignant> Enseignants { get;
set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 45 / 76


Code First L’héritage

Entity Framework
Dans le Main, on prépare les objets à persister
using(var model = new Model1())
{
var personne = new Personne()
{
Nom = "Pradel",
Prenom = "Jacques",
Age = 45
};
[Link](personne);
var etudiant = new Etudiant()
{
Nom = "Mary",
Prenom = "Michel",
Age = 35,
Bourse = 500
};
[Link](etudiant);
Mai - Juin 2018, M2i Aix en Provence 2018 46 / 76
Code First L’héritage

Entity Framework
Dans le Main, on prépare le dernier objet et on persiste tout
var enseignant = new Enseignant()
{
Nom = "Hanin",
Prenom = "Roger",
Age = 65,
Salaire = 6000
};
[Link](enseignant);
[Link]();
var persoQuery = from perso in [Link]
select perso;
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom }");
}
[Link]();

Mai - Juin 2018, M2i Aix en Provence 2018 47 / 76


Code First L’héritage

Entity Framework

Allons voir la base de données


une seule table Personne a été créée
cette table a les colonnes Id, Nom, Prenom, Age, Salaire,
Bourse et Discriminator
la personne Jacques Pradel a la valeur null dans Salaire
et Bourse et la valeur Personne dans Discriminator
l’étudiant Michel Mary a la valeur null dans Bourse et la
valeur Etudiant dans Discriminator
l’enseignant Roger Hanin a la valeur null dans Salaire et la
valeur Enseignant dans Discriminator

Mai - Juin 2018, M2i Aix en Provence 2018 48 / 76


Code First L’héritage

Entity Framework
Pour récupérer et afficher la liste des étudiants
var persoQuery = from perso in [Link]
select perso;
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom }");
// affiche Bonjour Michel Mary

Mai - Juin 2018, M2i Aix en Provence 2018 49 / 76


Code First L’héritage

Entity Framework
Pour récupérer et afficher la liste des étudiants
var persoQuery = from perso in [Link]
select perso;
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom }");
// affiche Bonjour Michel Mary

Pour récupérer et afficher la liste des enseignants


var persoQuery = from perso in [Link]
select perso;
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom }");
// affiche Bonjour Roger Hanin

Mai - Juin 2018, M2i Aix en Provence 2018 49 / 76


Code First L’héritage

Entity Framework
Table per Concrete Class : commençons par créer l’entité
Personne
public abstract 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; }
}

La classe Personne est maintenant abstraite.


Mai - Juin 2018, M2i Aix en Provence 2018 50 / 76
Code First L’héritage

Entity Framework
Créons l’entité Etudiant
[Table("Etudiant")]
public class Etudiant: Personne
{
public int Bourse { get; set; }
}

Et l’entité Enseignant
[Table("Enseignant")]
public class Enseignant: Personne
{
public int Salaire { get; set; }
}

On ajoute le décorateur [Table] aux classes filles.


Mai - Juin 2018, M2i Aix en Provence 2018 51 / 76
Code First L’héritage

Entity Framework

Mettons à jour la classe [Link]


public class Model1 : DbContext
{
public Model1()
: base("name=Model1")
{
}
public virtual DbSet<Etudiant> Etudiants { get; set;
}
public virtual DbSet<Enseignant> Enseignants { get;
set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 52 / 76


Code First L’héritage

Dans le Main, on prépare les objets et on les persiste


using(var model = new Model1())
{
var etudiant = new Etudiant()
{
Nom = "Mary",
Prenom = "Michel",
Age = 35,
Bourse = 500
};
[Link](etudiant);
var enseignant = new Enseignant()
{
Nom = "Hanin",
Prenom = "Roger",
Age = 65,
Salaire = 6000
};
[Link](enseignant);
[Link]();
var persoQuery = from perso in [Link]
select perso;
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { [Link] }");
}
Mai - Juin 2018, M2i Aix en Provence 2018 53 / 76
Code First L’héritage

Entity Framework

Allons voir la base de données


deux tables Etudiant et Enseignant ont été créées
la table Etudiant a les colonnes Id, Nom, Prenom, Age et
Bourse
la table Enseignant a les colonnes Id, Nom, Prenom, Age et
Salaire

Mai - Juin 2018, M2i Aix en Provence 2018 54 / 76


Code First L’héritage

Entity Framework

Table per Type : commençons par créer l’entité Personne


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; }
}

La classe Personne n’est plus abstraite.

Mai - Juin 2018, M2i Aix en Provence 2018 55 / 76


Code First L’héritage

Entity Framework
Créons l’entité Etudiant
[Table("Etudiant")]
public class Etudiant: Personne
{
public int Bourse { get; set; }
}

Et l’entité Enseignant
[Table("Enseignant")]
public class Enseignant: Personne
{
public int Salaire { get; set; }
}

On ajoute le décorateur [Table] aux classes filles.


Mai - Juin 2018, M2i Aix en Provence 2018 56 / 76
Code First L’héritage

Entity Framework

Mettons à jour la classe [Link]


public class Model1 : DbContext
{
public Model1()
: base("name=Model1")
{
}
public virtual DbSet<Personne> Personnes { get; set;
}
public virtual DbSet<Etudiant> Etudiants { get; set;
}
public virtual DbSet<Enseignant> Enseignants { get;
set; }
}

Mai - Juin 2018, M2i Aix en Provence 2018 57 / 76


Code First L’héritage

Entity Framework
Dans le Main, on prépare les objets à persister
using(var model = new Model1())
{
var personne = new Personne()
{
Nom = "Pradel",
Prenom = "Jacques",
Age = 45
};
[Link](personne);
var etudiant = new Etudiant()
{
Nom = "Mary",
Prenom = "Michel",
Age = 35,
Bourse = 500
};
[Link](etudiant);
Mai - Juin 2018, M2i Aix en Provence 2018 58 / 76
Code First L’héritage

Entity Framework
Dans le Main, on prépare le dernier objet et on persiste tout
var enseignant = new Enseignant()
{
Nom = "Hanin",
Prenom = "Roger",
Age = 65,
Salaire = 6000
};
[Link](enseignant);
[Link]();
var persoQuery = from perso in [Link]
select perso;
foreach(var elt in persoQuery)
[Link]($"Bonjour { [Link] } { elt.
Nom }");
}
[Link]();

Mai - Juin 2018, M2i Aix en Provence 2018 59 / 76


Code First L’héritage

Entity Framework

Allons voir la base de données


trois tables Personne, Etudiant et Enseignant ont été créées

la table Personne a les colonnes Id, Nom, Prenom et Age


la table Etudiant a les colonnes Id et Bourse
la table Enseignant a les colonnes Id et Salaire

Mai - Juin 2018, M2i Aix en Provence 2018 60 / 76


Database First

Entity Framework

Database First
Nous disposons d’une base de données
Nous allons donc générer les entités qui correspondent au
schéma relationnel existant
Ensuite utiliser LINQ to Entities pour manipuler la base de
données

Mai - Juin 2018, M2i Aix en Provence 2018 61 / 76


Database First

Entity Framework

Étapes à 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

Mai - Juin 2018, M2i Aix en Provence 2018 62 / 76


Database First

Entity Framework

La base de données existe (celle du projet précédent), on va l’importer


Clic droit sur le projet, Ajouter > Nouvel élément
Dans Éléments Visual C#, cliquer sur Données et
sélectionner [Link] Entity Data Model
Saisir MonModele dans Nom :
Valider
Choisir Code First à partir de la base de données et
cliquer sur Suivant > (On peut aussi choisir EF Designer à
partir de la base de données)
Cliquer sur Nouvelle connexion

Mai - Juin 2018, M2i Aix en Provence 2018 63 / 76


Database First

Entity Framework

Établir la connexion avec la base de données


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

Mai - Juin 2018, M2i Aix en Provence 2018 64 / 76


Database First

Entity Framework

Ensuite
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

Mai - Juin 2018, M2i Aix en Provence 2018 65 / 76


Database First

Entity Framework

C’est fini, vérifier que

les entités ont bien été générées


la classe MonModele (contexte) a été ajoutée aussi

Mai - Juin 2018, M2i Aix en Provence 2018 66 / 76


Database First

Entity Framework

C’est fini, vérifier que

les entités ont bien été générées


la classe MonModele (contexte) a été ajoutée aussi

Vérifier aussi
les noms des classes, objets dans tous les fichiers, y compris
MonModele, respectent les conventions, sinon, modifier les.

Mai - Juin 2018, M2i Aix en Provence 2018 66 / 76


Database First

Entity Framework
Dans le Main, on prépare les objets à 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
};
[Link](adresse);

Mai - Juin 2018, M2i Aix en Provence 2018 67 / 76


Database First

Entity Framework

Dans le Main, on prépare les objets à persister


[Link](adresse);
[Link](personne);
[Link]();

var persoQuery = from perso in [Link]


select perso;

foreach (var elt in persoQuery)


[Link]($"Bonjour {[Link]}
{[Link]} de {[Link]<
Adresse>().Ville}");

Mai - Juin 2018, M2i Aix en Provence 2018 68 / 76


Model First

Entity Framework

Model First
Pas de base de données
Pas d’entités

Mai - Juin 2018, M2i Aix en Provence 2018 69 / 76


Model First

Entity Framework

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

Mai - Juin 2018, M2i Aix en Provence 2018 69 / 76


Model First

Entity Framework

Étapes à 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

Mai - Juin 2018, M2i Aix en Provence 2018 70 / 76


Model First

Entity Framework

Pour créer le modèle


Clic droit sur le projet, Ajouter > Nouvel élément
Dans Éléments Visual C#, cliquer sur Données et
sélectionner [Link] Entity Data Model
Saisir MonModele dans Nom :
Valider
Choisir Modèle vide EF Designer et cliquer sur Terminer

Mai - Juin 2018, M2i Aix en Provence 2018 71 / 76


Model First

Entity Framework

Pour créer une entité


Aller dans la boı̂te à outils (à gauche)
Ensuite, faire soit double clic sur entité, soit glisser entité dans le
panneau central (créons deux entités Personne et Adresse)

Mai - Juin 2018, M2i Aix en Provence 2018 72 / 76


Model First

Entity Framework

Pour créer une entité


Aller dans la boı̂te à outils (à gauche)
Ensuite, faire soit double clic sur entité, soit glisser entité dans le
panneau central (créons deux entités Personne et Adresse)

Pour renommer une entité


faire double clic sur le nom d’entité et saisir le nouveau nom
ou aller dans le panneau propriété (à droite) et modifier la
propriété nom

Mai - Juin 2018, M2i Aix en Provence 2018 72 / 76


Model First

Entity Framework

Autres opérations

Pour ajouter un attribut : faire clic droit sur l’entité et aller dans
Ajouter nouveau > Propriété scalaire. Par défaut,
l’attribut est de type String. Pour changer, aller dans le panneau
Propriétés
Pour déclarer une clé composé : sélectionner les champs
concernés et aller dans le panneau Propriétés et mettre à
True la propriété Clé d’entité
Pour créer une association : clic droit dans le panneau central
ensuite aller dans Ajouter nouveau > Association,
renseigner les multiplicités (* *) et les propriétés de navigations
(Adresses Dans Personne et Personnes dans Adresse) et valider.

Mai - Juin 2018, M2i Aix en Provence 2018 73 / 76


Model First

Entity Framework

Pour générer la base de données

Clic droit sur le panneau central et sélectionner Générer la base de


données à partir du modèle

Cliquer sur Nouvelle connexion

Cliquer sur le bouton Modifier pour modifier la source de données

Sélectionner Microsoft SQL Server puis cliquer sur Ok

Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB

Dans Sélectionner ou entrer un nom d’une base de


données, saisir DatabaseFromModel (par exemple)

Cliquer sur OK

Mai - Juin 2018, M2i Aix en Provence 2018 74 / 76


Model First

Entity Framework
La base de données n’existe pas

Il faut donc demander à EF de la créer


Cliquer sur Suivant >
Un script SQL (DDL) permettant de créer la base de données est
généré
Cliquer sur Terminer
Pour créer la base de données, clic droit sur le script et choisir
Execute
Dans Le nom du serveur, saisir (localdb)\MSSQLLocalDB

Cliquer sur Se connecter

Mai - Juin 2018, M2i Aix en Provence 2018 75 / 76


Model First

Entity Framework

Aller dans l’Explorateur d’Objet SQL Server


Vérifier la création de la base de données

Mai - Juin 2018, M2i Aix en Provence 2018 76 / 76


Model First

Entity Framework

Aller dans l’Explorateur d’Objet SQL Server


Vérifier la création de la base de données

Aller dans l’Explorateur de solutions


Vérifier l’existence de deux entités
Vérifier la création de la classe contexte

Mai - Juin 2018, M2i Aix en Provence 2018 76 / 76

Vous aimerez peut-être aussi