RemoveRange在Entity Framework Core

时间:2016-10-18 19:38:57

标签: c# entity-framework-core

我收到错误:

  

无法跟踪实体类型'Pupil'的实例,因为另一个实例   已经跟踪了具有相同密钥的此类型的实例。什么时候   为大多数密钥类型添加新实体的唯一临时密钥值   如果没有设置密钥,则将创建(即,如果分配了密钥属性)   其类型的默认值)。如果您明确设置密钥   新实体的值,确保它们不会与现有实体发生冲突   为其他新实体生成的实体或临时值。什么时候   附加现有实体,确保只有一个实体实例   给定的键值附加到上下文。

如果我在此实例之前检索然后加载到上下文缓存中,我会理解这个错误,但我没有!!!!

    var pupilsToDelete = pupilIds.Select(id => new Pupil { Id = id });
    context.RemoveRange(pupilsToDelete.ToList());
    await context.SaveChangesAsync();

在运行期间,pupilIds都是不同的ID!

为什么我会收到错误?

2 个答案:

答案 0 :(得分:2)

要删除需要从上下文跟踪的记录。因此,不要创建Pupil的新集合,而只需从上下文

引用它们
 var pupilsToDelete = context.Pupils.Where(a => pupilIds.Contains(a.Id)).Select(b => b);
 context.Pupils.RemoveRange(pupilsToDelete);
 await context.SaveChangesAsync();

答案 1 :(得分:0)

为了能够删除记录,您需要确保您的ObjectContext正在跟踪它们。 @Mostafiz回答删除项目的最佳方法,但您也可以将实体附加到上下文。

var pupilsToDelete = pupilIds.Select(id => new Pupil { Id = id });
foreach(var p in pupilsToDelete )
   context.Attach(p);
context.RemoveRange(pupilsToDelete.ToList());
await context.SaveChangesAsync();

哪种方法不好。