Vous ne devriez pas créer de ShopID nullable si cela est requis par la conception.
Le problème que vous rencontrez est dû au fait que Add La méthode marque également de manière récursive toutes les instances d'entité accessibles via les propriétés de navigation et non actuellement suivies par le contexte comme Added (c'est-à-dire nouveau).
Il peut être résolu de plusieurs façons :
-
Définition de l'entrée d'entité sur
Addedau lieu deAddméthode :_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync(); -
Définition de la propriété de navigation sur
nullavant appelerAdd:Product.Shop = null; _context.Products.Add(Product); await _context.SaveChangesAsync(); -
Attacher l'objet de propriété de navigation avant appeler
Add:if (Product.Shop != null) _context.Attach(Product.Shop); _context.Products.Add(Product); await _context.SaveChangesAsync(); -
Utiliser
Updateau lieu deAdd:_context.Products.Update(Product); await _context.SaveChangesAsync();
La dernière technique est expliquée dans Sauvegarde des données - Entités déconnectées - Mélange d'entités nouvelles et existantes :
Comme cela ne fonctionne que lorsque toutes les entités utilisent des PK générés automatiquement et produit également des mises à jour inutiles des entités associées, je ne le recommande pas.