Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它_Asp.net Mvc - Fatal编程技术网

Asp.net mvc MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它

Asp.net mvc MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它,asp.net-mvc,Asp.net Mvc,我有一个Index.cshtml页面,其中有一个表,其中包含来自另一个表的外键。我在索引中添加了搜索功能,但搜索时会引发以下异常: MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它。 我已经运行了调试器,看起来它在ActionResult中运行得很好,但是当它尝试加载视图时,它在第11行崩溃。我怀疑这是因为该项是我数据库中的一个外键(在模型中表示为另一个类),因为我在其他索引中添加了搜索功能,它可以工作。我已经注释了第11行和第12行,异常不再发生

我有一个Index.cshtml页面,其中有一个表,其中包含来自另一个表的外键。我在索引中添加了搜索功能,但搜索时会引发以下异常:

MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它。

我已经运行了调试器,看起来它在ActionResult中运行得很好,但是当它尝试加载视图时,它在第11行崩溃。我怀疑这是因为该项是我数据库中的一个外键(在模型中表示为另一个类),因为我在其他索引中添加了搜索功能,它可以工作。我已经注释了第11行和第12行,异常不再发生

我来找你是因为尽管我似乎已经发现了问题,但我并不真正理解为什么会发生这种异常以及如何解决它。任何帮助都将不胜感激

PS:我使用了Microsoft文档中的代码来进行搜索功能

1    @foreach (var item in Model)
2    {
3       <tr>
4            <td>
5                @Html.DisplayFor(modelItem => item.nom)
6            </td>
7            <td>
8                @Html.DisplayFor(modelItem => item.adresse)
9            </td>
10           <td>
11             //   @Html.DisplayFor(modelItem => item.responsable.prenom)
12             //   @Html.DisplayFor(modelItem => item.responsable.nom)
13           </td>
14           <td>
15                @Html.DisplayFor(modelItem => item.telephone)
16           </td>
17        </tr>
18    }

切勿在控制器操作之外发送
IQueryable
或非物化
IEnumerable
:注意,代码如何调用
ToList()
previor以返回
视图(模型)

您需要在操作中将查询具体化为
列表
,以便可以安全地处置
DbContext
,而不会使悬空连接保持打开状态:

viewModel.Cinemas = await db.cinemas
    .Include(c => c.responsable)
    .ToListAsync();

切勿在控制器操作之外发送
IQueryable
或非物化
IEnumerable
:注意,代码如何调用
ToList()
previor以返回
视图(模型)

您需要在操作中将查询具体化为
列表
,以便可以安全地处置
DbContext
,而不会使悬空连接保持打开状态:

viewModel.Cinemas = await db.cinemas
    .Include(c => c.responsable)
    .ToListAsync();

我只添加了
ToList()到我的查询,因为我不熟悉异步方法,更重要的是不熟悉MVC,因为它是我的第一个项目。我很想知道更多关于它的事情。你有没有推荐一些我可以阅读的、对我有帮助的资源?您还可以解释一下为什么将IEnumerable发送到控制器外部是一种不好的做法吗?@pensum如果
IEnumerable
表示一个延迟计算的数据库查询,那么在
IEnumerable
foreach
.ToList()
方法(例如)中迭代之前,查询不会执行-这意味着与查询关联的数据库连接将保持活动状态,并且在呈现视图之前,应用程序的其他部分无法使用该连接-或者如果您的控制器(或ASP.NET本身)在呈现视图之前处理您的
DbContext
,则查询根本无法执行。@pensum通过返回
IQueryable
(即使它表示为
IEnumerable
),未计算的
IQueryable
的生存期绑定到其父
DbContext
的生存期从控制器操作中,它可能会比其父
DbContext
更长寿。像Rust这样的语言有表示对象生命周期的内置语法,我希望C#'有这样的功能,因为它在这样的情况下真的会有帮助到我的查询,因为我不熟悉异步方法,更重要的是不熟悉MVC,因为它是我的第一个项目。我很想知道更多关于它的事情。你有没有推荐一些我可以阅读的、对我有帮助的资源?您还可以解释一下为什么将IEnumerable发送到控制器外部是一种不好的做法吗?@pensum如果
IEnumerable
表示一个延迟计算的数据库查询,那么在
IEnumerable
foreach
.ToList()
方法(例如)中迭代之前,查询不会执行-这意味着与查询关联的数据库连接将保持活动状态,并且在呈现视图之前,应用程序的其他部分无法使用该连接-或者如果您的控制器(或ASP.NET本身)在呈现视图之前处理您的
DbContext
,则查询根本无法执行。@pensum通过返回
IQueryable
(即使它表示为
IEnumerable
),未计算的
IQueryable
的生存期绑定到其父
DbContext
的生存期从控制器操作中,它可能会比其父
DbContext
更长寿。像Rust这样的语言有表示对象生命周期的内置语法,我希望C#'有这样的功能,因为它在这种情况下真的会有帮助。