|
|
|
@ -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```.
|
|
|
|
|