0

我有一个名为Course_Predecessor数据库中的表,我试图删除使用EF此表中的所有项目,然后向表中添加新的数据。 我不能删除数据,因为我收到以下错误:“收集被修改的枚举操作可能不会执行”删除使用实体框架失败数据库中的项目

这是我使用的代码(在接收数据库的上下文为ctx)

List<Course_Predecessor> lst = new List<Course_Predecessor>(); 
fillTheList(ref lst , someData); 

ctx.Course_Predecessor.RemoveRange(ctx.Course_Predecessor.ToList()); 
ctx.Course_Predecessor.AddRange(predecessors); 

我在RemoveRange函数中得到错误。

将不胜感激任何帮助。

+0

如果你做'ctx.Course_Predecessor.RemoveRange(ctx.Course_Predecessor.ToList());'没有任何周围的代码会发生什么?这应该很好。 –

回答

0

试试这个,

ctx.Course_Predecessor.ToList().ForEach(r => ctx.Course_Predecessor.DeleteObject(r)); 
ctx.SaveChanges(); 
+0

我没有修改元素。 lst是我想插入到表中的新项目的列表(该函数只是将值插入到列表中)然后我想删除所有表并插入新值 – Adam

+0

@Adam是否按照建议尝试 – Sajeetharan

+0

我可以'吨试试这个,因为它不适合我的情况我的朋友我确实需要这些行以插入新值 – Adam

1

您可以尝试如下:

ctx.Course_Predecessor.ToList().ForEach(c => ctx.Course_Predecessor.Remove(c)); 
+0

它说ForEach没有定义 – Adam

+0

对不起,我错过了添加.ToList()。看到我更新的答案。这应该适合你。 – user1990

1

如果您正在使用EF6(这看起来像你),那么你应该能够删除所有记录该表通过执行以下操作。 (请注意,在RemoveRange呼叫缺席.ToList()方法)

ctx.Course_Predecessor.RemoveRange(ctx.Course_Predecessor); 
ctx.SaveChanges(); 

或者你可以这样做:

foreach (var predecessor in ctx.Course_Predecessor) 
{ 
    ctx.Entry(predecessor).State = EntryState.Deleted; 
} 
ctx.SaveChanges(); 

的代码段都做同样的事情。

+0

它仍然说收集被修改 – Adam

+0

@Adam我不认为'RemoveRange'调用触发收集修改的异常。我能够毫无问题地运行精确的代码。看起来您可能在修改集合的同时在您使用相同数据上下文的代码的前一部分中枚举它。您是否可以更新您的问题以包含“fillTheList”方法的代码以及在您尝试从该表中删除所有记录然后调用'SaveChanges'之前执行的任何其他代码? – sam2929