zoukankan      html  css  js  c++  java
  • 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读取期间是不允许进行数据库操作。

  • 相关阅读:
    Python【第三方模块&标准模块】
    Python【读写Json文件】
    python【内置函数&自定义函数】
    python【文件操作:读写文件】
    python【数据类型:列表与元组】
    QTP自传之录制
    测试工作杂谈
    心魔
    QTP自传之初识
    ActionScript学习笔记(七)——缓动和弹性运动
  • 原文地址:https://www.cnblogs.com/ricolee/p/This-MySqlConnection-is-already-in-use.html
Copyright © 2011-2022 走看看