Я создал модель класса POCO под названием Recipe
;соответствующий RecipeRepository
сохраняется эти объекты.Я использую Code First поверх существующей базы данных.
Каждый Recipe
содержит ICollection<RecipeCategory>
категорий, которые связывают таблицы Recipes
и Categories
в отношениях «многие ко многим».RecipeCategory
содержит соответствующие два внешних ключа.
Упрощенная версия моего контроллера и логики репозитория выглядит следующим образом (я закомментировал все проверки на авторизацию, null
объекты и т. Д. Для простоты):
public ActionResult Delete(int id)
{
_recipeRepository.Remove(id);
return View("Deleted");
}
Метод репозитория Remove
не выполняет ничего, кроме следующего:
public void Remove(int id)
{
Recipe recipe = _context.Recipes.Find(id);
_context.Recipes.Remove(recipe);
_context.SaveChanges();
}
Однако приведенный выше код не работает, поскольку я получаю System.InvalidOperationException
каждый раз, когда запускаю его: Добавление отношения с сущностью, находящейся в удаленном состоянии, недопустимо.
Что означает сообщение об ошибке и как я могу решить эту проблему?Единственное, чего я пытаюсь добиться - это удалить сущность.
@ Ladislav: Я заменил ICollection<RecipeCategory>
на ICollection<Category>
.Случайно ReSharper реорганизовал ключевое слово virtual
.
Однако проблема остается - я не могу удалить Category
из Recipe
сущности.В следующем коде не сохраняется удаление категорий в базе данных:
private void RemoveAllCategoriesAssignedToRecipe()
{
foreach (Category category in _recipe.Categories.ToArray())
{
_recipe.Categories.Remove(category);
category.Recipes.Remove(_recipe);
}
_context.SaveChanges();
}
Я отладил код и могу подтвердить, что коллекции изменены правильно, то есть они не содержат элементов после цикла (Я также использовал метод Clear()
).После вызова SaveChanges()
они снова заполняются.
Что я делаю не так?
(Может быть, это важно: я использую шаблон Singleton, чтобы иметь только один экземпляр контекста.)