首页 > 解决方案 > 实体框架错误:已经有一个打开的 DataReader 与此命令关联

问题描述

我在这里的代码有一些问题。我有这种方法可以检查当前是否有任何书籍与某个类别相关联,如果没有 - 您应该可以将其删除。当我检查一个没有书籍的类别和连接到它的书籍的类别时,这很有效。

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

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

db.attach(cat);
db.remove(cat);
db.savechanges();

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

标签: c#sqlentity-framework

解决方案


在这段代码中只有 1 个数据库连接,所以当你这样做时

foreach (var cat in db.BookCategories.Include("Books").Where(c => c.Id == CategoryId))

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

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

如果你这样做:

...... => c.Id == CategoryId).ToList())

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


推荐阅读