ASP.NET MVC 项目中 ADO.NET 实体模型的已打开 DataReader

Posted

技术标签:

【中文标题】ASP.NET MVC 项目中 ADO.NET 实体模型的已打开 DataReader【英文标题】:An already open DataReader for the ADO.NET Entity model in ASP.NET MVC project 【发布时间】:2013-06-30 14:14:21 【问题描述】:

我正在为我的 ASP.NET MVC 4 Razor 项目使用 ADO.NET 实体模型进行数据绑定和其他数据操作。

我正在尝试在我的模型中将这样的数据绑定到我的Controller

http://ideone.com/GvskaG

当我到达第 26 行时:

26. Sender = db.GetLoginByUserId(item.sender_id).FirstOrDefault(),
27. Receiver = db.GetLoginByUserId(item.recv_id).FirstOrDefault(),

我收到这样的错误:

“已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭。”

真的,我不明白如何手动关闭它,因为ADO.NET Entity太自动化了,我没有为DataReader或连接定义任何打开关闭。

我认为,这可能是因为第 15 行:

15. var currentUserId = db.GetUserIdByLogin(Request.Cookies["user-name"].Value);

当 GC 收集垃圾时,Entity 模型确实会打开连接/DataReader 并仅在大括号 符号后将其删除。

看起来我只能在单个方法中进行一次调用,但是如果我想从实体模型中进行更多调用,该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

此时您是否可能处于 foreach 循环中?这是导致这种情况的常用方法 - 在循环内执行 n+1(每个项目的查询)时遍历第一个读取器。通常的修复是(其中之一):

配置查询以急切地获取嵌套数据,以便它已经可用 将外循环缓冲到列表/数组中,以便在内循环开始之前完成读取器

【讨论】:

我已将Controller 的来源更改为这样的代码:ideone.com/jE6Ps1,并且数据绑定非常好,没有例外。谢谢你的建议,Marc,但我认为新代码确实看起来很丑 :( 实体模型这么异想天开吗?

以上是关于ASP.NET MVC 项目中 ADO.NET 实体模型的已打开 DataReader的主要内容,如果未能解决你的问题,请参考以下文章

带有 ADO .NET 的 ASP .NET MVC 会导致问题吗?

如何在带有 ADO.NET 的 ASP.NET Core MVC 中使用 jQuery Ajax 自动完成

ASP.NET MVC+JQueryEasyUI1.4+ADO.NET Demo

CRUD Operations In ASP.NET MVC 5 Using ADO.NET

.net、asp.net、MVC、Ado.Net、EF、ORM、NHibemate之间的关系?

如何在 Asp.Net Core Mvc 5.0 中将 sql 数据库与 ado.net 连接?