c# - 实体框架错误:已经有一个打开的 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();
我需要做什么才能通过这个?谢谢
解决方案
在这段代码中只有 1 个数据库连接,所以当你这样做时
foreach (var cat in db.BookCategories.Include("Books").Where(c => c.Id == CategoryId))
它使用连接开始阅读“书籍”。它开始阅读它们,然后一次阅读一个。
如果您尝试在循环内执行另一个数据库操作,则会收到该错误消息。原因是连接仍然在阅读书籍的中间,或者换句话说,阅读器仍然是打开的。
如果你这样做:
...... => c.Id == CategoryId).ToList())
然后它强制将所有书籍读入列表,并关闭阅读器,因此现在您可以对连接执行其他操作。
推荐阅读
- if-statement - 摆脱 if 语句
- ruby - Ruby - 使用类和方法的简单 ToDo 列表程序遇到问题
- java - 回收商更新卡片视图但不显示孩子
- c# - WPF ListView comsumed 自动完成文本框的焦点,因为文本框是它的 ItemsTemplate
- javascript - Firefox 扩展 - onPopupClose 事件?
- knockout.js - Knockout mapping - 只使 observableArray 的某些属性变为 observable
- c - 将 128 分配给 c 中的 char 变量
- python - 有什么区别。python中的嵌套函数和闭包函数之间
- deployment - 将 Service Fabric 应用从 Team Services 部署到 Azure
- regex - Matlab:用正则表达式替换字符串,通过插入当前匹配的部分