EF 4 CTP 5:无法尝试删除实体

时间:2011-02-27 17:25:07

标签: entity-framework code-first entity-framework-ctp5 ef-code-first

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

每个Recipe都包含ICollection<RecipeCategory>个类别,这些类别以多对多关系链接RecipesCategories表。 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模式只有一个上下文实例。)

1 个答案:

答案 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();
}