Не трябва да създавате 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 и също произвежда ненужни актуализации на свързаните обекти, не го препоръчвам.