Chapitre 3 EF
Chapitre 3 EF
Chapitre 3 EF
Définition
• ORM (Object Relational Mapping, Mapping objet relationnel) officiel de .NET
1 2
Définition Définition
Dans les ORM, il y a deux composants : • Entity Framework (EF) était intégré dans .NET framework 3.5 depuis 2008
• Les entités (des classes à implémenter par le développeur) : qui représentent • La version d’EF incluse dans .NET framework est EF6
certaines tables •Version mature, qui supporte les modèles d’héritage complexes
•Le gestionnaire d’entités (une classe qui existe déjà) : à utiliser pour persister les •A partir de EF6.3 , EF est extrait de .NET framework et est devenu dans un
entités dans la base de données. package séparé
Dans le cas d’entity framework : • Il supporte désormais .Net Core 3.0 et les versions d’après incluant .NET5.
• Les entités : des classes décorées (annotées)
•Le gestionnaire d’entités : Linq to Entities
3 4
1
15/10/2021
5 6
2
15/10/2021
9 10
11 12
3
15/10/2021
13 14
•Création d’un projet Console • Entity Framework Core a besoin d’un modèle (Entity Data Model) pour
communiquer avec la base de données
•Intégrer Entity Framework Core et Entity Framework Core SQL Server dans le
projet en utilisant Nuget Package manager • Il construit un modèle basé sur la forme de vos classes de domaine, les
annotations de données et les configurations de Fluent API.
• Créer le modèle (Entity Data Model)
•Le modèle EF comporte trois parties: le modèle conceptuel, le modèle de
• Créer les entités stockage et le mapping entre le modèle conceptuel et de stockage
• Générer la base de données et manipuler les données avec LINQ to Entities • Dans l'approche code-first, EF construit le modèle conceptuel basé sur vos
classes de domaine (classes d'entité), la classe de contexte et les configurations.
• EF Core crée le modèle de stockage et les mappages en fonction du fournisseur
que vous utilisez. Par exemple, le modèle de stockage sera différent pour SQL
Server par rapport à DB2.
15 16
4
15/10/2021
• EF utilise ce modèle pour les opérations CRUD (Créer, Lire, Mettre à jour,
Supprimer) dans la base de données sous-jacente. Nous devons donc
d'abord créer des classes d'entités et des classes de contexte. Les éléments
suivants sont des classes d'entités simples pour Student et Course :
• Bouton droit sur notre solution (nommée ENISSchool), ajouter classe dans le
dossier modèle, la nommer Student.cs
17 18
19 20
5
15/10/2021
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
Code First: Etapes à suivre
using System.Text;
using System.Threading.Tasks;
{
• Ces deux vont être mappées à deux tables Students et Courses dans la base de
public DbSet<Student> Students { get; set; }
données ENIS
• Dans la méthode OnConfiguring(),une instance de DbContextOptionsBuilder est
public DbSet<Course> Courses { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder utilisée pour spécifier quelle est la base de données à utiliser.
optionsBuilder)
{
•
optionsBuilder.UseSqlServer(@"Server=DESKTOP-
UM4MFE5;Database=SchoolDB;Trusted_Connection=True;");
}
21 22
23 24
6
15/10/2021
25 26
27 28
7
15/10/2021
• S’il y aura des modifications ou des ajouts dans les classes ou les configurations, Lire et écrire les données
nous avons besoin de synchroniser la base avec le modèle en utilisant les
commandes add-migration et update-database. Maintenant nous pouvons utiliser la classe context pour enregistrer et extraire
les données:
Dans Program.cs:
29 30
using System;
using System.Linq; using (var context = new ENISContext())
using ENISSchool; {
using Microsoft.EntityFrameworkCore;
namespace EnisSchool var std = new Student()
{ {
class Program Name = name,
{ SurName = surname,
static void Main(string[] args) Class=classEtd
{
string name, surname, classEtd; };
Console.WriteLine("The student name:"); context.Students.Add(std);
name = Console.ReadLine(); context.SaveChanges();
Console.WriteLine("The student Surname:"); }
surname = Console.ReadLine(); }
Console.WriteLine("The student class:"); }
classEtd = Console.ReadLine(); }
31 32
8
15/10/2021
• Maintenant nous avons besoin d’exécuter des requêtes pour extraire les Dans Program.cs, nous ajoutons le code suivant pour afficher l’étudiant ayant un nom saisi par l’utilisateur
35 36
9
15/10/2021
37 38
39 40
10
15/10/2021
41 42
43 44
11
15/10/2021
45 46
47 48
12
15/10/2021
49 50
13
15/10/2021
Convention 3 Convention 3
• Une autre convention EF pour la relation un-à-plusieurs consiste à inclure une
propriété de navigation aux deux extrémités, ce qui entraînera également une
•Dans l'exemple ci-dessus, l'entité Student inclut une propriété de navigation de
relation un-à-plusieurs (convention 1 + convention 2).
référence de type Grade et la classe d'entité Grade inclut une propriété de
public class Student public class Grade
{
navigation de liste IList<Student>, ce qui entraîne une relation un-à-plusieurs entre
{ public int Id { get; set; } les tables de base de données correspondantes Students et Grades, même comme
public int ClassNumber { get; set; }
public int StudentId { get; set; }
public string Speciality { get; set; } dans la convention 1
public string Name { get; set; }
public IList<Student> Students { get; set; }
public string SurName { get; set; } }
53 54
Convention 4 Convention 4
La définition complète de la relation aux deux extrémités avec la propriété de clé
étrangère dans l'entité dépendante crée une relation un-à-plusieurs.
public class Student public class Grade
{
{ public int Id { get; set; }
public int StudentId { get; set; }
public int ClassNumber { get; set; } • Dans l'exemple ci-dessus, l'entité Student inclut une propriété de clé étrangère GradeId
public string Speciality { get; set; }
public string Name { get; set; }
de type int et sa propriété de navigation de référence Grade. À l'autre extrémité, l'entité
public string SurName { get; set; } }
public IList<Student> Students { get; set; } Grade inclut également une propriété de navigation de liste IList<Student>. Cela créera
public string Class { get; set; }
une relation un-à-plusieurs avec la colonne de clé étrangère NotNull dans la table
public int GradeId { get; set; }
Étudiants, comme indiqué ci-dessous.
public Grade Grade { get; set; }
• Si vous souhaitez que la clé étrangère GradeId soit nullable, utilisez le type de
}
données int nullable (Nullable<int> ou int?), comme indiqué ci-dessous.
public int? GradeId { get; set; }
55 56
14
15/10/2021
57 58
15
15/10/2021
61 62
63 64
16
15/10/2021
65 66
67 68
17
15/10/2021
System.ComponentModel.DataAnnotations.Schema Attributes
System.ComponentModel.DataAnnotations Attributes
Attribut Description
System.ComponentModel.DataAnnotations Attributes Attribut Description
Key Peut être appliqué à une propriété pour spécifier une propriété de clé Table Peut être appliqué à une classe d'entité pour configurer le nom de table et le schéma
dans une entité et faire de la colonne correspondante une colonne correspondants dans la base de données.
PrimaryKey dans la base de données.
Column Peut être appliqué à une propriété pour configurer le nom de colonne correspondant,
Required Peut être appliqué à une propriété pour spécifier que la colonne l'ordre et le type de données dans la base de données.
correspondante est une colonne NotNull dans la base de données.
ForeignKey Peut être appliqué à une propriété pour la marquer comme propriété de clé étrangère.
MinLength Peut être appliqué à une propriété pour spécifier la longueur de
NotMapped Peut être appliqué à une propriété ou à une classe d'entités qui doit être exclue du
chaîne minimale autorisée dans la colonne correspondante de la base
modèle et ne doit pas générer de colonne ou de table correspondante dans la base de
de données.
données.
MaxLength Peut être appliqué à une propriété pour spécifier la longueur de
chaîne maximale autorisée dans la colonne correspondante de la base
de données.
StringLength Peut être appliqué à une propriété pour spécifier la longueur de
chaîne maximale autorisée dans la colonne correspondante de la base
de données.
69 70
71 72
18
15/10/2021
73 74
{ context.SaveChanges();
Name = name,
Comment insérer plusieurs enregistrements en même temps?
SurName = surname,
Class = classEtd,
Comment supprimer les données relationnelles
Grade = grd,
Address=adr
};
75 76
19
15/10/2021
Héritage Héritage
Héritage •Une seule table pour les trois classes : Table per Hierarchy (TPH)
Supposons que l’on a une classe mère Person et deux classes filles Student et • Une table pour chaque classe concrète : Table per Concrete Class (TPC)
Professor qui étendent Personne.
• Une table indépendante pour chaque classe : Table per Type (TPT)
Comment gérer cet héritage?
77 78
namespace Heritage
{
79
} 80
20
15/10/2021
81 82
context.Students.Add(std);
static void Main(string[] args) context.SaveChanges();
Spécifique à }; context.Professors.Add(prof);
Professor context.SaveChanges();
Spécifique à }
Student }
}
}
83 84
21
15/10/2021
85 86
87 88
22
15/10/2021
Database first
La commande Scaffold-DbContext ci-dessus crée des classes d'entités pour
chaque table de la base de données SchoolDB et une classe de contexte (en
dérivant DbContext) avec des configurations d'API Fluent pour toutes les entités
du dossier Models.
91
23