实体框架错误:已经有一个与此命令关联的打开的 DataReader

Scr*_*ead 5 c# sql entity-framework

我这里的代码有一些问题。我有这个方法来检查当前是否有任何书籍连接到某个类别,如果没有 - 您应该能够将其删除。当我检查没有书籍的类别和与之相关的书籍的类别时,这会起作用。

using(var db = new DatabaseContext())
{
foreach (var cat in db.BookCategories.Include("Books").Where(c => c.Id == CategoryId)) { 
                    
 if(cat.Books.Count != 0)
 {
 Console.WriteLine("Category cannot be deleted, because there are still books connected to it");
 } else
 {
 Console.WriteLine("Category can be deleted, because there are no books connected to it");
 }
}
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在 else 语句下添加附加、删除和保存更改时,我收到此错误“System.InvalidOperationException:'已经有一个与此连接关联的打开的 DataReader,必须首先关闭它。”

db.attach(cat);
db.remove(cat);
db.savechanges();
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能通过这个?谢谢

mik*_*egg 16

在此代码中只有 1 个数据库连接,因此当您执行此操作时

foreach (var cat in db.BookCategories.Include("Books").Where(c => c.Id == CategoryId))
Run Code Online (Sandbox Code Playgroud)

它使用该连接开始阅读“书籍”。它开始读取它们,然后一次读取一个。

如果您尝试在循环内执行另一个数据库操作,您会收到该错误消息。原因是连接仍然在阅读书籍的过程中,或者换句话说,读者仍然是开放的。

如果你这样做:

...... => c.Id == CategoryId).ToList())
Run Code Online (Sandbox Code Playgroud)

然后它会强制将所有书籍读入列表,并关闭阅读器,因此现在您可以通过连接执行其他操作。