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
AddedzamiastAddmetoda:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync(); -
Ustawienie właściwości nawigacji na
nullprzed 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
UpdatezamiastAdd:_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.