gpt4 book ai didi

entity-framework - EF 4 CTP 5 : Trouble trying to remove an entity

转载 作者:行者123 更新时间:2023-12-01 06:46:11 24 4
gpt4 key购买 nike

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

Recipe包含 ICollection<RecipeCategory>链接 Recipes 的类别和 Categories表中的多对多关系。 RecipeCategory包含对应的两个外键。

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

但是,问题仍然存在——我无法删除 Category来自 Recipe实体。以下代码不会将类别的删除持久化到数据库:
private void RemoveAllCategoriesAssignedToRecipe()
{
foreach (Category category in _recipe.Categories.ToArray())
{
_recipe.Categories.Remove(category);
category.Recipes.Remove(_recipe);
}

_context.SaveChanges();
}

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

我究竟做错了什么?

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

最佳答案

我能够通过以下方式解决问题:

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

关于entity-framework - EF 4 CTP 5 : Trouble trying to remove an entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com