Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

ef core um para muitos relacionamento lança exceção Não é possível adicionar ou atualizar uma linha filho


Você não deve fazer ShopID anulável se for exigido por design.

O problema que você está enfrentando é porque Add O método também marca recursivamente todas as instâncias de entidade alcançáveis ​​por meio de propriedades de navegação e não rastreadas atualmente pelo contexto como Added (ou seja, novo).

Pode ser resolvido de várias maneiras:

  • Configurando a entrada de entidade para Added em vez de Add método:
    _context.Entry(Product).State = EntityState.Added;
    await _context.SaveChangesAsync();
    

  • Configurando a propriedade de navegação para null antes chamando Add :
    Product.Shop = null;
    _context.Products.Add(Product);
    await _context.SaveChangesAsync();
    

  • Anexando o objeto de propriedade de navegação antes chamando Add :
    if (Product.Shop != null) _context.Attach(Product.Shop);
    _context.Products.Add(Product);
    await _context.SaveChangesAsync();
    

  • Usando Update em vez de Add :
    _context.Products.Update(Product);
    await _context.SaveChangesAsync();
    

A última técnica é explicada em Salvando dados - Entidades desconectadas - Mistura de entidades novas e existentes :

Como funciona apenas quando todas as entidades usam PKs gerados automaticamente e também produz atualizações desnecessárias das entidades relacionadas, não recomendo.