This MySqlConnection is already in use

Posted 牧白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了This MySqlConnection is already in use相关的知识,希望对你有一定的参考价值。

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

20191128104409-mysqlconnect.png

报错如下:

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源码进行调试。

还是没找到什么答案。

20191128143159-pomelo-mysql.png

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的主要内容,如果未能解决你的问题,请参考以下文章

webstorm报错TypeError: this.cliEngine is not a constructor

[解决]TypeError: this.getOptions is not a function

在.net中怎么实现字符串反转,比如:this is a cat 反转后的结果应为 cat a is this

&diesel::MysqlConnection 没有实现特征diesel::Connection

未定义的属性:Illuminate\Database\MySqlConnection - 查询包含参数,但是我收到此错误。怎么了

此 MySqlConnection 已用于带有 MySQL 的 .net