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
Added
au lieu deAdd
méthode :_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync();
-
Définition de la propriété de navigation sur
null
avant 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
Update
au 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.