Merci pour ta réponse iR3SH.
Depuis mon dernier message j'ai remarqué que j'avais fait une erreur d'observation, le model binding n’était pas vraiment le problème, c’était plutôt celui de l'enregistrement des données :
Le cas où j'obtenais une exception SQL était une bonne piste, pour info c'était celle là : SqlException: Cannot insert explicit value for identity column in table 'Pieces' when IDENTITY_INSERT is set to OFF.
J'ai remarqué que contrairement à ce que je pensais, le model binding fonctionnait dans ce cas là.
C’était avec le code suivant :
<select name="Voiture.Pieces[i].PieceId"> ... </select>
Le problème c'est que j'étais persuadé que EFCore, connaissant l'entité (Piece) et disposant d'un Id (PieceId), pourrait faire le lien avec ce qui existait en base de données : apparemment non.
Au lieu de se dire : tu as sélectionné une Piece avec, certes une Reference null (la propriété string pas la reference d'objet) mais un PieceId valide => j'en déduis que tu veux créer une association entre la voiture et cette pièce,
EFCore déduit : tu veux ajouter en base de données cette Piece sans Reference, en forçant le PieceId.
A partir de ce constat, j'ai ajouté cette ligne dans mon OnPost() pour que cela fonctionne :
Voiture.Pieces = ListePieces.Where(x => Voiture.Pieces.Select(p => p.PieceId).Contains(x.PieceId)).ToList();
Avec cette ligne je récupère les Pieces en base de données correspondant aux pièces sélectionnées dans mon formulaire (via les PieceId) et EFCore comprends enfin qu'il faut créer des liens entre la voiture et ces pièces.
J'ignore s'il est possible de faire fonctionner EFCore comme dans mon raisonnement initial mais dans l'immédiat c'est la seule solution que j'ai trouvé.
En résumé : une classe de moins à créer (PieceVoiture) mais une étape de plus à ajouter pour l'enregistrement.
Pour répondre à ton message :
- Pas de soucis d'Include dans ce cas vu que Piece ne dépendait pas d'autres objets, je récupérai seulement PieceId et Reference.
- Pour les ICollection j'avais des soucis d'indexation [] lors de ma création de listes donc j'ai pas trouvé d'autres choix que de les définir en List.
- Je n'avais pas crée de relations dans le DbContext, j’espérais que cela puisse fonctionner sans dans un premier temps.
Pour ta dernière remarque tu as raison cela ne pouvait pas fonctionner sans @ par contre vu que je l'utilisais dans une boucle c’était plutôt "Voiture.Pieces[@i].PieceId".
Partager