4

我创建了一个名为的模型 POCO 类Recipe;一个相应的RecipeRepository持久化这些对象。我在现有数据库之上使用 Code First。

EveryRecipe包含一个以多对多关系链接和表ICollection<RecipeCategory>的类别。包含对应的两个外键。RecipesCategoriesRecipeCategory

我的控制器和存储库逻辑的简化版本如下所示(为简单起见,我已注释掉所有对授权、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关键字。

但是,问题仍然存在——我无法CategoryRecipe实体中删除 a。以下代码不会将类别的删除持久化到数据库中:

private void RemoveAllCategoriesAssignedToRecipe()
{
    foreach (Category category in _recipe.Categories.ToArray())
    {
        _recipe.Categories.Remove(category);
        category.Recipes.Remove(_recipe);
    }

    _context.SaveChanges();
}

我已经调试了代码,可以确认集合被正确修改了——也就是说,它们在循环之后不包含任何元素(我也使用了该Clear()方法)。调用后SaveChanges(),它们再次被填充。

我究竟做错了什么?

(也许这很重要:我使用单例模式只有一个上下文实例。)

4

1 回答 1

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();
}
于 2011-03-02T12:28:05.363 回答