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