|
|
|
@ -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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|