我收到错误:
无法跟踪实体类型'Pupil'的实例,因为另一个实例 已经跟踪了具有相同密钥的此类型的实例。什么时候 为大多数密钥类型添加新实体的唯一临时密钥值 如果没有设置密钥,则将创建(即,如果分配了密钥属性) 其类型的默认值)。如果您明确设置密钥 新实体的值,确保它们不会与现有实体发生冲突 为其他新实体生成的实体或临时值。什么时候 附加现有实体,确保只有一个实体实例 给定的键值附加到上下文。
如果我在此实例之前检索然后加载到上下文缓存中,我会理解这个错误,但我没有!!!!
var pupilsToDelete = pupilIds.Select(id => new Pupil { Id = id });
context.RemoveRange(pupilsToDelete.ToList());
await context.SaveChangesAsync();
在运行期间,pupilIds都是不同的ID!
为什么我会收到错误?
答案 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();
哪种方法不好。