Mysql
 sql >> Base de données >  >> RDS >> Mysql

ef core relation un à plusieurs levée d'exception Impossible d'ajouter ou de mettre à jour une ligne enfant

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 de Add méthode :

    _context.Entry(Product).State = EntityState.Added;
    await _context.SaveChangesAsync();
    
  • Définition de la propriété de navigation sur null avant appeler Add :

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

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