使用EF Core删除范围

时间:2017-03-31 11:14:20

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

在使用InMemoryDatabase在我的单元测试中使用RemoveRange批量删除数据时出现错误。

以下是代码:

public void DeletePatient(Paciente patient)
{
    var schedules = dbContext.Schedules.AsNoTracking().Where(x => x.PatientId == patient.Id).ToList();
    dbContext.Schedules.RemoveRange(schedules);

    dbContext.Patients.Remove(patient);
}

这会抛出此错误:

  

InvalidOperationException:无法跟踪实体类型“Schedule”的实例,因为已经跟踪了具有相同键的此类型的另一个实例。添加新实体时,对于大多数密钥类型,如果未设置密钥,则将创建唯一的临时密钥值(即,如果为密钥属性指定了其类型的默认值)。如果要为新实体显式设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突。附加现有实体时,请确保只有一个具有给定键值的实体实例附加到上下文。

但是,如果我执行foreach并重新加载每个实体,它可以工作:

foreach(var item in schedules)
{
    var h = dbContext.Schedules.Find(item.Id);
    dbContext.Remove(h);
}

同样的foreach,使用该项直接给出了相同的错误:

foreach(var item in schedules)
{
    dbContext.Remove(item);
}

1 个答案:

答案 0 :(得分:2)

尝试删除AsNoTracking子句。我还没有对它进行过测试,但我的猜测是,这会导致EF重新读取数据库中的实体,而不是在上下文中找到实体。如果没有该子句,它应该找到要删除的上下文中的实际实体。