finished sample ex_042_016

EFCore3_Reforged
Marc CHEVALDONNE 5 years ago
parent 08813c6089
commit b67ad07860

@ -1,6 +1,6 @@
# ex_042_016_OneToMany_FluentAPI
*22/01/2020 ⋅ Marc Chevaldonné*
*25/01/2020 ⋅ Marc Chevaldonné*
---
@ -97,10 +97,13 @@ est lié.
modelBuilder.Entity<Morceau>()
.Property<int>("AlbumForeignKey");
```
<img src="./readme_files/ex_042_015_classDiagram2.svg"/>
* on décrit ensuite la relation *OneToMany* avec les lignes suivantes (on peut
lire : "1 ```Morceau``` est lié à 1 ```Album``` qui lui-même est lié à
PLUSIEURS ```Morceau``` en utilisant la clé étrangère ```HasForeignKey```") :
<img src="./readme_files/ex_042_016_classDiagram2.svg"/>
* on décrit ensuite la relation *OneToMany* avec les lignes suivantes, qu'on
peut interpréter de la manière suivante :
> 1 ```Morceau``` est lié à 1 ```Album``` qui lui-même est lié à
PLUSIEURS ```Morceau``` en utilisant la clé étrangère ```HasForeignKey```
```csharp
// Use the shadow property as a foreign key
modelBuilder.Entity<Morceau>()
@ -112,8 +115,6 @@ modelBuilder.Entity<Morceau>()
puisqu'elle est définie dans ```OnModelCreating``` et pas directement dans la
classe entité (ici ```Morceau```).
TO BE FINISHED
### La classe ```StubbedContext```
* ```StubbedContext``` est une classe fille de ```AlbumDBEntities```.
@ -132,31 +133,26 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<Album>().HasData(kindofblue, dialogue);
modelBuilder.Entity<Morceau>().Property<int>("AlbumId");
modelBuilder.Entity<Morceau>().HasData(new { MorceauId = 1, AlbumId = 1, Titre = "So What" },
new { MorceauId = 2, AlbumId = 1, Titre = "Freddie Freeloader" },
new { MorceauId = 3, AlbumId = 1, Titre = "Blue in Green" },
new { MorceauId = 4, AlbumId = 1, Titre = "All Blues" },
new { MorceauId = 5, AlbumId = 1, Titre = "Flamenco Sketches" },
new { MorceauId = 6, AlbumId = 2, Titre = "Catta" },
new { MorceauId = 7, AlbumId = 2, Titre = "Idle While" },
new { MorceauId = 8, AlbumId = 2, Titre = "Les Noirs Marchant" },
new { MorceauId = 9, AlbumId = 2, Titre = "Dialogue" },
new { MorceauId = 10, AlbumId = 2, Titre = "Ghetto Lights" },
new { MorceauId = 11, AlbumId = 2, Titre = "Jasper" }
modelBuilder.Entity<Morceau>().HasData(new { MorceauId = 1, AlbumForeignKey = 1, Titre = "So What" },
new { MorceauId = 2, AlbumForeignKey = 1, Titre = "Freddie Freeloader" },
new { MorceauId = 3, AlbumForeignKey = 1, Titre = "Blue in Green" },
new { MorceauId = 4, AlbumForeignKey = 1, Titre = "All Blues" },
new { MorceauId = 5, AlbumForeignKey = 1, Titre = "Flamenco Sketches" },
new { MorceauId = 6, AlbumForeignKey = 2, Titre = "Catta" },
new { MorceauId = 7, AlbumForeignKey = 2, Titre = "Idle While" },
new { MorceauId = 8, AlbumForeignKey = 2, Titre = "Les Noirs Marchant" },
new { MorceauId = 9, AlbumForeignKey = 2, Titre = "Dialogue" },
new { MorceauId = 10, AlbumForeignKey = 2, Titre = "Ghetto Lights" },
new { MorceauId = 11, AlbumForeignKey = 2, Titre = "Jasper" }
);
}
```
* __Attention toutefois__, ici, puisque nous devons donner la clé étrangère, il faut
d'abord ajouter une colonne (une propriété) à notre entité ```Morceau```, qui permettra
de stocker la clé étrangère pour pointer l'```Album``` associé :
```csharp
modelBuilder.Entity<Morceau>().Property<int>("AlbumId");
```
* Contrairement aux deux exemples précédents, il n'est pas nécessaire de préciser
qu'elle est la clé étrangère pour relier les tables puisque cela a été fait
dans la classe ```AlbumDBEntities```
* Remarquez que __À AUCUN MOMENT__ nous ne précisons les valeurs des propriétés
```Album``` de ```Morceau``` et ```Morceaux``` de ```Album```.
Le simple fait d'utiliser la clé étrangère (propriété ```AlbumId```
Le simple fait d'utiliser la clé étrangère (propriété ```AlbumForeignKey```
ajoutée précédemment) dans ```Morceau``` est suffisant.
* Notez que ce ne sera pas le cas lors d'une utilisation *classique* de nos classes
(ajout, modification...). Nous ne donnerons plus les identifiants directement mais
@ -254,7 +250,7 @@ dirigez-vous dans le menu *Outils*, puis *Gestionnaire de package NuGet*, puis
* Dans la console que vous venez d'ouvrir, déplacez-vous dans le dossier du projet
.NET Core, ici :
```
cd .\p08_BDD_EntityFramework\ex_042_015_OneToMany_conventions
cd .\p08_BDD_EntityFramework\ex_042_016_OneToMany_FluentAPI
```
*Note*:
si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra
@ -268,14 +264,14 @@ peut-être utiliser également :
* Migration : vous devez préciser la classe fille de ```DbContext``` à utiliser :
soit ```AlbumDBEntities```, soit ```StubbedContext```.
```
dotnet ef migrations add ex_042_015 --context StubbedContext
dotnet ef migrations add ex_042_016 --context StubbedContext
```
* Création de la table :
```
dotnet ef database update --context StubbedContext
```
* Génération et exécution
Vous pouvez maintenant générer et exécuter l'exemple **ex_042_015_OneToMany_conventions**.
Vous pouvez maintenant générer et exécuter l'exemple **ex_042_016_OneToMany_FluentAPI**.
* Le résultat de l'exécution va ressembler à (si vous avez utilisé
```StubbedContext```) :
@ -356,7 +352,7 @@ Morceaux :
Il suffit de faire exactement comme dans le paragraphe précédent, mais en choisissant
le contexte ```AlbumDBEntities``` à la place de ```StubbedContext``` :
```
dotnet ef migrations add ex_042_015 --context AlbumDBEntities
dotnet ef migrations add ex_042_016 --context AlbumDBEntities
dotnet ef database update --context AlbumDBEntities
```
Lors de l'exécution, le résultat sera évidemment différent puisqu'il n'y aura pas les
@ -392,12 +388,12 @@ Pour vérifier le contenu de votre base SQLite, vous pouvez utiliser le programm
* Rendez-vous sur la page : https://sqlitebrowser.org/dl/ et téléchargez le programme *DB Browser*.
* Lancez *DB Browser for SQLite*
* Glissez-déposez au milieu de la fenêtre de *DB Browser for SQLite* le fichier
*ex_042_015_OneToMany_conventions.Albums.db* qui a été généré par l'exécution du
programme et qui se trouve près de *ex_042_015_OneToMany_conventions.csproj*.
![DB Browser for SQLite](./readme_files/dbbrowser01.png)
*ex_042_016_OneToMany_FluentAPI.Albums.db* qui a été généré par l'exécution du
programme et qui se trouve près de *ex_042_016_OneToMany_FluentAPI.csproj*.
![DB Browser for SQLite](../ex_042_015_OneToMany_conventions/readme_files/dbbrowser01.png)
* Choisissez ensuite l'onglet *Parcourir les données*
* Observez les résultats obtenus des deux tables
![DB Browser for SQLite](./readme_files/dbbrowser02.png)
![DB Browser for SQLite](./readme_files/dbbrowser03.png)
![DB Browser for SQLite](../ex_042_015_OneToMany_conventions/readme_files/dbbrowser02.png)
![DB Browser for SQLite](../ex_042_015_OneToMany_conventions/readme_files/dbbrowser03.png)

Loading…
Cancel
Save