Update ReadMe.md

EFCore3_Reforged
Marc CHEVALDONNE 5 years ago
parent fe46bd2aa2
commit 575fc3ebfd

@ -1,4 +1,4 @@
# ex_042_016_OneToMany_FluentAPI
# ex_042_016_OneToMany_FluentAPI
*22/01/2020 ⋅ Marc Chevaldonné*
@ -88,36 +88,32 @@ modelBuilder.Entity<Morceau>().Property(m => m.MorceauId)
.ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion
```
* on ajoute la clé étrangère dans l'entité ```Morceau``` qui permettra d'établir la
relation OnToMany avec l'```Album``` concerné
relation OnToMany avec l'```Album``` concerné. Comme dit plus haut, le lien
entre les deux tables va se faire avec l'ajout d'une colonne dans la table
de ```Morceau``` qui permettra de stocker l'```Album``` auquel ce ```Morceau```
est lié.
```csharp
// Add the shadow property to the model
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```") :
```csharp
// Use the shadow property as a foreign key
modelBuilder.Entity<Morceau>()
.HasOne(m => m.Album)
.WithMany(a => a.Morceaux)
.HasForeignKey("AlbumForeignKey");
```
* notez enfin que la clé étrangère est ici également une *shadow property*
puisqu'elle est définie dans ```OnModelCreating``` et pas directement dans la
classe entité (ici ```Morceau```).
TO BE FINISHED
##### Quelques explications supplémentaires :
Comme dit plus haut, le lien entre les deux tables va se faire avec l'ajout d'une
colonne dans la table de ```Morceau``` qui permettra de stocker l'```Album```
auquel ce ```Morceau``` est lié.
Dans le cas de l'utilisation des *conventions d'écriture* et des
*annotations de données*, ceci peut se faire explicitement ou implicitement.
Cet exemple, le fait de manière implicite avec les *conventions d'écriture*. Mais il
est possible de le faire de manière explicite en utilisant les *annotations de données*
(cf. [ex_042_014 : One To Many with dataAnnotations](../ex_042_014_OneToMany_dataAnnotations))
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 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
cette propriété (cf. plus bas, lors de l'utilisation de ```StubbedContext```).
### La classe ```StubbedContext```
* ```StubbedContext``` est une classe fille de ```AlbumDBEntities```.

Loading…
Cancel
Save