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
Addeden lugar deAddmétodo:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync(); -
Establecer la propiedad de navegación en
nullantes 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
Updateen 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.