Asp.net mvc MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它
我有一个Index.cshtml页面,其中有一个表,其中包含来自另一个表的外键。我在索引中添加了搜索功能,但搜索时会引发以下异常: MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它。 我已经运行了调试器,看起来它在ActionResult中运行得很好,但是当它尝试加载视图时,它在第11行崩溃。我怀疑这是因为该项是我数据库中的一个外键(在模型中表示为另一个类),因为我在其他索引中添加了搜索功能,它可以工作。我已经注释了第11行和第12行,异常不再发生 我来找你是因为尽管我似乎已经发现了问题,但我并不真正理解为什么会发生这种异常以及如何解决它。任何帮助都将不胜感激 PS:我使用了Microsoft文档中的代码来进行搜索功能Asp.net mvc MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它,asp.net-mvc,Asp.net Mvc,我有一个Index.cshtml页面,其中有一个表,其中包含来自另一个表的外键。我在索引中添加了搜索功能,但搜索时会引发以下异常: MySqlException:已经有一个与此连接关联的打开的DataReader,必须先关闭它。 我已经运行了调试器,看起来它在ActionResult中运行得很好,但是当它尝试加载视图时,它在第11行崩溃。我怀疑这是因为该项是我数据库中的一个外键(在模型中表示为另一个类),因为我在其他索引中添加了搜索功能,它可以工作。我已经注释了第11行和第12行,异常不再发生
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#'有这样的功能,因为它在这种情况下真的会有帮助。