У вас есть три запроса к базе данных: 1) context.MarketCategories.Load()
(надеюсь, таблица категорий мала, в противном случае это будет неисполнение при загрузке всей таблицы в память), 2) ...Find
и 3) dbProd.Categories.Clear()
: Здесь должна быть отложенная загрузка, иначе это приведет к сбою, потому что dbProd.Categories
будет null
.
Альтернативой обновлению с помощью одного запроса к базе данных является:
private void UpdateNew(MarketProduct marketproduct)
{
MarketProduct dbProd = context.MarketProducts
.Include(p => p.Categories)
.Single(p => p.Id == marketproduct.Id);
var categories = marketproduct.Categories
?? Enumerable.Empty<MarketCategory>();
foreach (var category in categories)
{
if (!dbProd.Categories.Any(c => c.Id == category.Id))
{
// means: category is new
context.MarketCategories.Attach(category);
dbProd.Categories.Add(category);
}
}
foreach (var category in dbProd.Categories.ToList())
{
if (!categories.Any(c => c.Id == category.Id))
// means: category has been removed
dbProd.Categories.Remove(category);
}
context.Entry(dbProd).CurrentValues.SetValues(marketproduct);
// context.SaveChanges() somewhere
}