Mysql
 sql >> Database >  >> RDS >> Mysql

ef core relazione uno a molti genera eccezione Impossibile aggiungere o aggiornare una riga figlio

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 di Add metodo:

    _context.Entry(Product).State = EntityState.Added;
    await _context.SaveChangesAsync();
    
  • Impostazione della proprietà di navigazione su null prima chiamando Add :

    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 di Add :

    _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.