我创建了一个名为Recipe
的模型POCO类;相应的RecipeRepository
仍然存在这些对象。我在现有数据库之上使用Code First。EF 4 CTP 5:尝试删除实体时遇到问题
每Recipe
包含在许多一对多的关系Recipes
和Categories
表链接类别的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模式仅具有上下文的一个实例)
确定只有这个代码被执行?这个错误通常意味着你的配方有一些挂起的关系到尚未保存的类别。此外,Find方法能够从DbContex的内部存储装载实体,并且只有在找不到它时才会查询数据库。你什么时候实例化你的DbContext?另一件事:为什么食谱包含ICollection而不是ICollection ? –
2011-02-27 17:38:05
@Ladislav:请参阅我更新的帖子。 – 2011-02-27 22:25:19
没有人有想法吗? – 2011-03-02 11:54:46