为什么RemoveRange在已经被跟踪的实体上失败?

时间:2019-09-30 19:27:07

标签: c# entity-framework entity-framework-core

使用数据库上下文的实体集合添加条目后,如果尝试调用RemoveRange,则会收到InvalidOperationException。

如果我使用数据库上下文的另一个实例来调用RemoveRange,则可以正常工作。但是当我使用相同的数据库上下文时,它将失败。

var ingredient = new Ingredient()
{
    Id = 1,
    Name = "Pepper",
};
await context.Ingredients.AddAsync(ingredient);
await context.SaveChangesAsync();

context.Ingredients.RemoveRange(context.Ingredients);
await context.SaveChangesAsync();

错误消息是:

  

System.InvalidOperationException:无法跟踪实体类型'Ingredient'的实例,因为已经跟踪了另一个键值为'{IngredientId:1}'的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

如果我正确理解,如果尚未跟踪该实体,则Remove()和RemoveRange()会附加该实体。在我的情况下,一个实例已经被跟踪了……是的,但是

什么是删除所有条目的正确方法,而无需关心哪些实体已被跟踪和哪些实体尚未被跟踪?

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

尝试将context.Ingredients.RemoveRange(context.Ingredients);行替换为以下内容:

var tempIngredients = context.Ingredients.ToList(); 
context.Ingredients.RemoveRange(tempIngredients);