Не трябва да създавате ShopID nullable, ако се изисква от дизайна.
Проблемът, който срещате, е защото Add метод също така рекурсивно маркира всички екземпляри на обекти, достъпни чрез навигационни свойства и в момента не се проследяват от контекста като Added (т.е. нов).
Може да се реши по много начини:
-
Задаване на запис на обект на
AddedвместоAddметод:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync(); -
Задаване на свойството за навигация на
nullпреди извикване наAdd:Product.Shop = null; _context.Products.Add(Product); await _context.SaveChangesAsync(); -
Прикачване на обекта на свойството за навигация before извикване на
Add:if (Product.Shop != null) _context.Attach(Product.Shop); _context.Products.Add(Product); await _context.SaveChangesAsync(); -
Използване на
UpdateвместоAdd:_context.Products.Update(Product); await _context.SaveChangesAsync();
Последната техника е обяснена в Запазване на данни - Прекъснати обекти - Комбинация от нови и съществуващи обекти :
Тъй като работи само когато всички обекти използват автоматично генерирани PK и също произвежда ненужни актуализации на свързаните обекти, не го препоръчвам.