繁体   English   中英

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

[英]Entity Framework error: There is already an open DataReader associated with this Command

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

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

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

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

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

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

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

如果你这样做:

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

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

原来我只需要在 cat 变量的末尾添加.ToList()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM