0

我正在为我的 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 实体太自动了,我没有定义任何打开正在关闭 DataReader 或连接。

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

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

并且实体模型确实打开连接/DataReader 并仅在大括号}符号后删除它们,当 GC 收集垃圾时。

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

谢谢!

4

1 回答 1

0

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

  • 将查询配置为急切地获取嵌套数据,以便它已经可用
  • 将外循环缓冲到列表/数组中,以便读取器在内循环开始之前完成
于 2013-06-30T14:30:48.813 回答