Non dovresti creare ShopID
nullable se è richiesto dalla progettazione.
Il problema che stai riscontrando è perché Add
il metodo inoltre contrassegna ricorsivamente tutte le istanze di entità raggiungibili tramite le proprietà di navigazione e non attualmente tracciate dal contesto come Added
(cioè nuovo).
Può essere risolto in molti modi:
-
Impostazione della voce dell'entità su
Added
invece diAdd
metodo:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync();
-
Impostazione della proprietà di navigazione su
null
prima chiamandoAdd
:Product.Shop = null; _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Allegando l'oggetto della proprietà di navigazione prima chiamando
Add
:if (Product.Shop != null) _context.Attach(Product.Shop); _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Usando
Update
invece diAdd
:_context.Products.Update(Product); await _context.SaveChangesAsync();
L'ultima tecnica è spiegata in Salvataggio dati - Entità disconnesse - Combinazione di entità nuove ed esistenti :
Poiché funziona solo quando tutte le entità utilizzano PK generati automaticamente e produce anche aggiornamenti non necessari delle entità correlate, non lo consiglio.