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
Addedinvece diAddmetodo:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync(); -
Impostazione della proprietà di navigazione su
nullprima 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
Updateinvece 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.