我创建了一个名为的模型 POCO 类Recipe
;一个相应的RecipeRepository
持久化这些对象。我在现有数据库之上使用 Code First。
EveryRecipe
包含一个以多对多关系链接和表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
实体中删除 a。以下代码不会将类别的删除持久化到数据库中:
private void RemoveAllCategoriesAssignedToRecipe()
{
foreach (Category category in _recipe.Categories.ToArray())
{
_recipe.Categories.Remove(category);
category.Recipes.Remove(_recipe);
}
_context.SaveChanges();
}
我已经调试了代码,可以确认集合被正确修改了——也就是说,它们在循环之后不包含任何元素(我也使用了该Clear()
方法)。调用后SaveChanges()
,它们再次被填充。
我究竟做错了什么?
(也许这很重要:我使用单例模式只有一个上下文实例。)