我创建了一个名为Recipe
的模型POCO类;相应的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
:不允许与处于Deleted状态的实体添加关系。 < / p>
错误消息代表什么?如何解决问题?我唯一想要实现的是删除一个实体。
@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模式只有一个上下文实例。)
答案 0 :(得分:0)
我能够通过以下方式解决问题:
private void RemoveAllCategoriesAssignedToRecipe()
{
foreach (Category category in _recipe.Categories.ToArray())
{
Category categoryEntity = _categoryRepository.Retrieve(category.CategoryID);
var recipesAssignedToCategory = categoryEntity.Recipes.ToArray();
categoryEntity.Recipes.Clear();
foreach (Recipe assignedRecipe in recipesAssignedToCategory)
{
if (assignedRecipe.RecipeID == _recipe.RecipeID)
{
continue;
}
categoryEntity.Recipes.Add(assignedRecipe);
}
_context.Entry(categoryEntity).State = EntityState.Modified;
}
_recipe.Categories.Clear();
_context.SaveChanges();
}