使用EF Core刪除範圍

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

一般承認的答案

嘗試刪除AsNoTracking子句。我沒有測試過,但我的猜測是這導致EF重新讀取數據庫中的實體而沒有找到上下文中的實體。如果沒有該子句,它應該找到要刪除的上下文中的實際實體。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow