No deberías hacer ShopID
anulable si es requerido por diseño.
El problema que está experimentando se debe a que Add
El método también marca recursivamente todas las instancias de entidad accesibles a través de las propiedades de navegación y que el contexto no rastrea actualmente como Added
(es decir, nuevo).
Se puede resolver de muchas maneras:
-
Establecer la entrada de la entidad en
Added
en lugar deAdd
método:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync();
-
Establecer la propiedad de navegación en
null
antes llamando aAdd
:Product.Shop = null; _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Adjuntar el objeto de propiedad de navegación antes llamando a
Add
:if (Product.Shop != null) _context.Attach(Product.Shop); _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Usando
Update
en lugar deAdd
:_context.Products.Update(Product); await _context.SaveChangesAsync();
La última técnica se explica en Guardar datos - Entidades desconectadas - Combinación de entidades nuevas y existentes :
Dado que solo funciona cuando todas las entidades usan PK generadas automáticamente y también produce actualizaciones innecesarias de las entidades relacionadas, no lo recomiendo.