Nie powinieneś tworzyć ShopID
nullable, jeśli jest to wymagane przez projekt.
Problem, którego doświadczasz, jest spowodowany tym, że Add
metoda również rekursywnie oznacza wszystkie instancje jednostki osiągalne przez właściwości nawigacji i nie są obecnie śledzone przez kontekst jako Added
(tj. nowy).
Można to rozwiązać na wiele sposobów:
-
Ustawianie wpisu encji na
Added
zamiastAdd
metoda:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync();
-
Ustawienie właściwości nawigacji na
null
przed dzwoniącAdd
:Product.Shop = null; _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Dołączanie obiektu właściwości nawigacji przed dzwoniąc
Add
:if (Product.Shop != null) _context.Attach(Product.Shop); _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Korzystanie z
Update
zamiastAdd
:_context.Products.Update(Product); await _context.SaveChangesAsync();
Ostatnia technika jest wyjaśniona w Zapisywanie danych – Odłączone encje – Mieszanka nowych i istniejących encji :
Ponieważ działa tylko wtedy, gdy wszystkie jednostki używają automatycznie generowanych PK, a także wytwarza niepotrzebne aktualizacje powiązanych jednostek, nie polecam tego.