4

我创建了一个名为Recipe的模型POCO类;相应的RecipeRepository仍然存在这些对象。我在现有数据库之上使用Code First。EF 4 CTP 5:尝试删除实体时遇到问题

Recipe包含在许多一对多的关系RecipesCategories表链接类别的ICollection<RecipeCategory>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(); 
} 

Howevery,上面的代码不工作,因为我收到System.InvalidOperationException我每次运行它:添加了一个连接的关系不允许处于已删除状态的实体。

错误信息代表什么,我该如何解决问题?我试图达到的唯一目标就是删除一个实体。


@Ladislav:我已经ICollection<Category>取代ICollection<RecipeCategory>。有意思的是,ReSharper重构了关键字virtual

但是,问题仍然存在 - 我无法从Recipe实体中删除Category。下面的代码不类别的删除持久化到数据库:

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

    _context.SaveChanges(); 
} 

我已经调试代码,并可以确认集合正确修改 - 也就是说,它们包含在循环之后没有元素(我有也使用Clear()方法)。在致电SaveChanges()后,他们再次填充。

我在做什么错?

(也许这是很重要的。我现在用的是Singleton模式仅具有上下文的一个实例)

+2

确定只有这个代码被执行?这个错误通常意味着你的配方有一些挂起的关系到尚未保存的类别。此外,Find方法能够从DbContex的内部存储装载实体,并且只有在找不到它时才会查询数据库。你什么时候实例化你的DbContext?另一件事:为什么食谱包含ICollection 而不是ICollection ? – 2011-02-27 17:38:05

+0

@Ladislav:请参阅我更新的帖子。 – 2011-02-27 22:25:19

+0

没有人有想法吗? – 2011-03-02 11:54:46

回答

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(); 
} 
相关问题