码迷,mamicode.com
首页 > 数据库 > 详细

This MySqlConnection is already in use

时间:2019-11-29 10:50:49      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:数据   text   就是   class   src   sele   操作   reac   取出   

项目中类似于以下的代码,实际的代码要更复杂,DbContext是依赖注入的:

技术图片

报错如下:

This MySqlConnection is already in use. See https://fl.vu/mysql-conn-reuse

错误提示就是MySqlConnection在使用了。分析了代码,没觉得有什么问题。

网上搜了不少,针对这个问题也是很少:

粗略的看了一下,感觉和我的问题关系不大。

后来看到这句代码,会不会是没有使用ToList()的原因:

var menus = db.Menus.Select(a => a.Name);

果然加上ToList()后没有异常了!。

为什么呢?

Select()是延迟加载,在foreach是向数据库读取数据,为什么读取出来后执行SaveChanges()会报错呢?

在这篇文章Connection Reuse找这段代码:

using (var connection = CreateOpenConnection())
using (var command = new MySqlCommand("SELECT id FROM ...", connection))
using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        var idToUpdate = reader.GetValue(0);
        connection.Execute("UPDATE ... SET ..."); // don't do this
    }
}

在打开MySqlDataReader时是不能进行操作的。

foreach进行从数据读取menus时也进行了读操作,这个读操作是不是用了MySqlDataReader呢?。

以上是EF Core+MySql实现的,EF Core+SqlServer就不会有这样的问题。

于是下载了Pomelo.EntityFrameworkCore.MySql源码进行调试。

还是没找到什么答案。

技术图片

Pomelo.EntityFrameworkCore.MySql是构建在MySqlConnector之上的,MySqlConnector不熟悉没有研究过,有机会再研究吧!

总结

var menus = db.Menus.Select(a => a.Name);
foreach (var item in menus)

foreach执行延迟加载在EFCore+SqlServerEFCore+Mysql的实现方式是不一样的。

有可能像之前说的,在MySqlDataReader读取期间是不允许进行数据库操作。

This MySqlConnection is already in use

标签:数据   text   就是   class   src   sele   操作   reac   取出   

原文地址:https://www.cnblogs.com/ricolee/p/This-MySqlConnection-is-already-in-use.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!