Neměli byste vytvářet ShopID
s možností zrušení hodnoty null, pokud to vyžaduje návrh.
Problém, se kterým se setkáváte, je způsoben tím, že Add
metoda také rekurzivně označí všechny instance entity dosažitelné prostřednictvím vlastností navigace a aktuálně nesledované kontextem jako Added
(tj. nové).
Dá se to vyřešit mnoha způsoby:
-
Nastavení položky entity na
Added
místoAdd
metoda:_context.Entry(Product).State = EntityState.Added; await _context.SaveChangesAsync();
-
Nastavení vlastnosti navigace na
null
před voláníAdd
:Product.Shop = null; _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Připojení objektu vlastnosti navigace před volání
Add
:if (Product.Shop != null) _context.Attach(Product.Shop); _context.Products.Add(Product); await _context.SaveChangesAsync();
-
Pomocí
Update
místoAdd
:_context.Products.Update(Product); await _context.SaveChangesAsync();
Poslední technika je vysvětlena v Ukládání dat – Odpojené entity – Mix nových a stávajících entit :
Protože to funguje pouze v případě, že všechny entity používají automaticky generované PK, a také vytváří zbytečné aktualizace souvisejících entit, nedoporučuji to.