RemoveRange在Entity Framework Core中拋出InvalidOperationException

c# entity-framework-core

我收到錯誤:

無法跟踪實體類型'Pupil'的實例,因為已經跟踪了具有相同密鑰的此類型的另一個實例。添加新實體時,對於大多數鍵類型,如果未設置任何鍵,則將創建唯一的臨時鍵值(即,如果為鍵屬性指定了其類型的默認值)。如果要為新實體顯式設置鍵值,請確保它們不會與現有實體或為其他新實體生成的臨時值發生衝突。附加現有實體時,請確保只有一個具有給定鍵值的實體實例附加到上下文。

我會理解這個錯誤,如果我在此實例之前檢索然後加載到上下文緩存中,但我沒有!

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

在運行期間,pupilIds都是不同的ID!

為什麼我會收到這個錯誤?

一般承認的答案

要刪除記錄,需要從上下文中跟踪。因此,不是創建新的Pupil集合,而是從上下文中引用它們

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

熱門答案

為了能夠刪除記錄,您需要確保您的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();

這不是好方法



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因