ended ex_042_015

EFCore3_Reforged
Marc CHEVALDONNE 5 years ago
parent 3402c70c71
commit 9ebee1c72d

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

@ -322,7 +322,8 @@ Morceaux :
Pour vérifier le contenu de votre base SQLite, vous pouvez utiliser le programme *DB Browser* :
* 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_014_OneToMany_dataAnnotations.Nounours.db* qui a été généré par l'exécution du programme et qui se trouve près de *ex_042_014_OneToMany_dataAnnotations.csproj*.
* Glissez-déposez au milieu de la fenêtre de *DB Browser for SQLite* le fichier
* *ex_042_014_OneToMany_dataAnnotations.Albums.db* qui a été généré par l'exécution du programme et qui se trouve près de *ex_042_014_OneToMany_dataAnnotations.csproj*.
![DB Browser for SQLite](./readme_files/dbbrowser01.png)
* Choisissez ensuite l'onglet *Parcourir les données*
* Observez les résultats obtenus des deux tables

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

@ -82,9 +82,9 @@ est possible de le faire de manière explicite en utilisant les *annotations de
ou de manière explicite en utilisant la *Fluent API* (cf. [ex_042_016 : One To Many with Fluent API](../ex_042_016_OneToMany_FluentAPI)).
Ici, c'est *EF Core* qui ajoute automatiquement une propriété ```AlbumId```
à ```Morceau``` : c'est la clé étrangère. Le nom de cette propriété est choisi à
partir du nom de la propriété allant de ```Morceau``` à ```Album``` (ici ```Album```) +
le type pointé par la clé étrangère (ici ```Album```) + ```Id``` => +
ici ```AlbumAlbumId```.
partir d'une combinaison du nom de la propriété allant de ```Morceau``` à ```Album``` (ici ```Album```),
du type pointé par la clé étrangère (ici ```Album```), et de ```Id``` => ici *EF Core*
a *choisi* ```AlbumId```.
Tout ceci est fait automatiquement.
<img src="./readme_files/ex_042_015_classDiagram2.svg"/>
Toutefois, pour l'utilisation de données *stubbées*, il est nécessaire d'expliciter
@ -108,28 +108,47 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<Album>().HasData(kindofblue, dialogue);
modelBuilder.Entity<Morceau>().HasData(new Morceau { MorceauId = 1, AlbumForeignKey = 1, Titre = "So What" },
new Morceau { MorceauId = 2, AlbumForeignKey = 1, Titre = "Freddie Freeloader" },
new Morceau { MorceauId = 3, AlbumForeignKey = 1, Titre = "Blue in Green" },
new Morceau { MorceauId = 4, AlbumForeignKey = 1, Titre = "All Blues" },
new Morceau { MorceauId = 5, AlbumForeignKey = 1, Titre = "Flamenco Sketches" },
new Morceau { MorceauId = 6, AlbumForeignKey = 2, Titre = "Catta" },
new Morceau { MorceauId = 7, AlbumForeignKey = 2, Titre = "Idle While" },
new Morceau { MorceauId = 8, AlbumForeignKey = 2, Titre = "Les Noirs Marchant" },
new Morceau { MorceauId = 9, AlbumForeignKey = 2, Titre = "Dialogue" },
new Morceau { MorceauId = 10, AlbumForeignKey = 2, Titre = "Ghetto Lights" },
new Morceau { MorceauId = 11, AlbumForeignKey = 2, Titre = "Jasper" } );
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" }
);
}
```
* 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é ```AlbumForeignKey```) 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 les références des propriétés ```Morceaux``` et ```Album```.
* __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");
```
* 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```
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
les références des propriétés ```Morceaux``` et ```Album```.
### La classe ```Program```
* On affiche tout d'abord le contenu de la base (c'est-à-dire rien ou d'anciennes données si la migration est faite à partir de ```AlbumDBEntites```) ou le stub (si la migration est faite à partir de ```StubbedContext```).
*Notez l'utilisation d'```Include``` dans ```db.Albums.Include(a => a.Morceaux)``` sinon, les ```Morceau``` ne sont pas chargés.
```Include``` n'est pas utilisé ensuite dans ```db.Morceaux``` car les ```Album``` ont déjà été chargés depuis la connexion.
Mais on aurait pu faire les accès dans l'autre sens et dans ce cas d'abord ```db.Morceaux.Include(m => m.Album)``` puis simplement ```db.Albums```.*
* On affiche tout d'abord le contenu de la base (c'est-à-dire rien ou d'anciennes
données si la migration est faite à partir de ```AlbumDBEntites```) ou le stub
(si la migration est faite à partir de ```StubbedContext```).
*Notez l'utilisation d'```Include``` dans
```db.Albums.Include(a => a.Morceaux)``` sinon, les ```Morceau``` ne sont pas
chargés.
```Include``` n'est pas utilisé ensuite dans ```db.Morceaux``` car les
```Album``` ont déjà été chargés depuis la connexion.
Mais on aurait pu faire les accès dans l'autre sens et dans ce cas d'abord
```db.Morceaux.Include(m => m.Album)``` puis simplement ```db.Albums```.*
```csharp
using (AlbumDBEntities db = new AlbumDBEntities())
{
@ -202,32 +221,40 @@ using (AlbumDBEntities db = new AlbumDBEntities())
}
```
## Comment exécuter cet exemple ?
Pour tester cette application, n'oubliez pas les commandes comme présentées dans l'exemple ex_041_001 : pour générer l'exemple, il vous faut d'abord préparer les migrations et les tables.
* Ouvrez la *Console du Gestionnaire de package* sous Windows (pour cela, dirigez-vous dans le menu *Outils*, puis *Gestionnaire de package NuGet*, puis *Console du Gestionnaire de package*) ou le *Terminal* sous MacOSX.
* Dans la console que vous venez d'ouvrir, déplacez-vous dans le dossier du projet .NET Core, ici :
Pour tester cette application, n'oubliez pas les commandes comme présentées dans
l'exemple ex_041_001 : pour générer l'exemple, il vous faut d'abord préparer les
migrations et les tables.
* Ouvrez la *Console du Gestionnaire de package* sous Windows (pour cela,
dirigez-vous dans le menu *Outils*, puis *Gestionnaire de package NuGet*, puis
*Console du Gestionnaire de package*) ou le *Terminal* sous MacOSX.
* 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_014_OneToMany_dataAnnotations
cd .\p08_BDD_EntityFramework\ex_042_015_OneToMany_conventions
```
*Note*:
si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra peut-être utiliser également :
si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra
peut-être utiliser également :
* ```dotnet tool install --global dotnet-ef``` si vous utilisez la dernière version de .NET Core (3.1 aujourd'hui),
* ```dotnet tool install --global dotnet-ef --version 3.0.0``` si vous vous utiliser spécifiquement .NET Core 3.0.
* Migration : vous devez préciser la classe fille de ```DbContext``` à utiliser : soit ```AlbumDBEntities```, soit ```StubbedContext```.
* Migration : vous devez préciser la classe fille de ```DbContext``` à utiliser :
soit ```AlbumDBEntities```, soit ```StubbedContext```.
```
dotnet ef migrations add ex_042_014 --context StubbedContext
dotnet ef migrations add ex_042_015 --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_014_OneToMany_dataAnnotations**.
Vous pouvez maintenant générer et exécuter l'exemple **ex_042_015_OneToMany_conventions**.
* Le résultat de l'exécution va ressembler à (si vous avez utilisé ```StubbedContext```) :
* Le résultat de l'exécution va ressembler à (si vous avez utilisé
```StubbedContext```) :
```
Albums :
1: Kind of Blue (sorti le : 17/08/1959)
@ -302,12 +329,14 @@ Morceaux :
```
## Comment exécuter cet exemple sans le stub ?
Il suffit de faire exactement comme dans le paragraphe précédent, mais en choisissant le contexte ```AlbumDBEntities``` à la place de ```StubbedContext``` :
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_014 --context AlbumDBEntities
dotnet ef migrations add ex_042_015 --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 2 albums du stub.
Lors de l'exécution, le résultat sera évidemment différent puisqu'il n'y aura pas les
2 albums du stub.
Il pourra ressembler à :
```
Albums :
@ -338,7 +367,9 @@ Morceaux :
Pour vérifier le contenu de votre base SQLite, vous pouvez utiliser le programme *DB Browser* :
* 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_014_OneToMany_dataAnnotations.Nounours.db* qui a été généré par l'exécution du programme et qui se trouve près de *ex_042_014_OneToMany_dataAnnotations.csproj*.
* 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)
* Choisissez ensuite l'onglet *Parcourir les données*
* Observez les résultats obtenus des deux tables

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

@ -76,7 +76,7 @@
<g transform="translate(-94,-230) scale(1,1)">
<g>
<path fill="none" stroke="none"/>
<text fill="#c00000" stroke="none" font-family="Arial" font-size="13px" font-style="italic" font-weight="normal" text-decoration="none" x="469" y="312.5">+AlbumAlbumId: int</text>
<text fill="#c00000" stroke="none" font-family="Arial" font-size="13px" font-style="italic" font-weight="normal" text-decoration="none" x="469" y="312.5">+AlbumId: int</text>
</g>
</g>
<g transform="translate(-94,-230) scale(1,1)">
@ -119,7 +119,7 @@
<g>
<path fill="none" stroke="none"/>
<text fill="#000000" stroke="none" font-family="Arial" font-size="13px" font-style="normal" font-weight="normal" text-decoration="none" x="341" y="362">ForeignKey :</text>
<text fill="#000000" stroke="none" font-family="Arial" font-size="13px" font-style="normal" font-weight="normal" text-decoration="none" x="341" y="375">AlbumAlbumId</text>
<text fill="#000000" stroke="none" font-family="Arial" font-size="13px" font-style="normal" font-weight="normal" text-decoration="none" x="341" y="375">AlbumId</text>
</g>
</g>
<g transform="translate(-94,-230) scale(1,1)">

Loading…
Cancel
Save