Bonjour,

Je développe un site en .Net Razor pages avec Entity framework Core 5 et j'essaye de comprendre comment récupérer automatiquement les données de mon formulaire (model binding) quand on a une propriété issus d'une relation many to many (sans entité intermédiaire).

Par exemple si j'ai une entité Voiture et une entité Pièce avec la relation : une voiture a plusieurs pièces et une pièce est utilisée sur plusieurs voitures.

Si j'ai bien compris, depuis EFCore 5 il y a 2 façons de créer cette relation many to many :
soit avec une entité intermédiaire : Voiture - PieceVoiture - Piece
soit seulement avec les deux entités concernées : Voiture - Piece

Dans le premier cas je n'ai pas de soucis de récupération de données :

Coté entités :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public class Voiture
    {
        public int VoitureId { get; set; }
        public string Nom { get; set; }
        public List<PieceVoiture> Pieces { get; set; }
    }
 
    public class Piece
    {
        public int PieceId { get; set; }
        public string Reference { get; set; }
        public List<PieceVoiture> Voitures { get; set; }
    }
 
   public class PieceVoiture
    {
        public int VoitureId { get; set; }
        public int PieceId { get; set; }
        public Voiture Voiture { get; set; }
        public Piece Piece { get; set; }
    }
Coté Razor pages :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
[BindProperty]
public Voiture Voiture {get; set;}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<select name="Voiture.Pieces[i].PieceId"> ... </select>
il me suffit de construire mes listes déroulantes avec cette propriété name pour que les éléments sélectionnés soit automatiquement assignés à la propriété Pieces de mon modèle.

Dans le deuxième cas, cela ne fonctionne pas.

Coté entités :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Voiture
    {
        public int Id { get; set; }
        public string Nom { get; set; }
        public List<Piece> Pieces { get; set; }
    }
 
    public class Piece
    {
        public int Id { get; set; }
        public string Reference { get; set; }
        public List<Voiture> Voitures { get; set; }
    }
Coté Razor pages :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
<select name="Voiture.Pieces[i].PieceId"> ... </select>
Je n'arrive pas à trouver ce que je dois renseigner dans la propriété name pour que cela fonctionne. Selon mes essais (Voiture.Pieces[i].PieceId, Voiture.Pieces[i].PiecesId, Voiture.Pieces[i], etc...) soit il ne se passe rien soit j'ai une exception Sql parce qu'il tente d'ajouter une entrée dans Piece au lieu de PieceVoiture.

Auriez vous une idée ? Connaîtriez vous des astuces pour débugger ce processus de model binding ?