项目中类似于以下的代码,实际的代码要更复杂,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的更多相关文章

  1. MySqlConnection 并发连接的问题

    最近在做项目的过程中遇到一个MySql在并发时初始化的问题,场景是这样子的: 我在Job中设定在同一时间点启动多个操作来访问数据库更新数据,结果在创建连接的时候抛出下面的问题: Note that w ...

  2. Mysql的MySqlDataReader对于MysqlConnection是独占式

    写Secondlife智能体的知识系统小插件的时候遇到的这个问题. 在把某个NPC的全部知识复制给另一个NPC的时候,对数据库操作,为了提升一点效率希望与数据库建立一次连接,全部添加进表以后再断开连接 ...

  3. ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)

    操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...

  4. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  5. .NET Core 使用Dapper 操作MySQL

    MySQL官方驱动:http://www.cnblogs.com/linezero/p/5806814.html .NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使 ...

  6. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  7. MyCat源码分析系列之——结果合并

    更多MyCat源码分析,请戳MyCat源码分析系列 结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实 ...

  8. MyCat源码分析系列之——SQL下发

    更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...

  9. MyCat源码分析系列之——前后端验证

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ...

随机推荐

  1. Gym - 101194H Great Cells

    Problem H. Great Cells 题目链接:https://codeforces.com/gym/101194/attachments Input file: Standard Input ...

  2. CTF_工具网址收藏

    杂项 条形码在线扫描 :    https://online-barcode-reader.inliteresearch.com/ PS弄反色ctr+i    :  https://zhidao.ba ...

  3. Java机试题目

    1.生成一个随机四位数,每位数字不重复. package com.cloud.stagging.lhcloudzuul; import java.util.Random; /** * 1.生成一个随机 ...

  4. day37—javascript对表格table的操作应用(二)

    转行学开发,代码100天——2018-04-22 昨天学习了JavaScript对table的基本操作,包括表格的创建,表格元素的获取,隔行换色及鼠标动作等.今天主要学习table的搜索查询及排序操作 ...

  5. MyEclipse上有main函数类运行报错:Editor does not contain a

    MyEclipse下有main函数类运行报错:Editor does not contain a main type?出现这种问题的原因是,该java文件   MyEclipse下有main函数类运行 ...

  6. mybatis缓存机制(转)

    缓存在互联网系统中是非常重要的, 其主要作用是将数据保存到内存中, 当用户查询数据 时, 优先从缓存容器中获取数据,而不是频繁地从数据库中查询数据,从而提高查询性能.目 前流行的缓存服务器有Mongo ...

  7. hdu6570Wave (暴力求解)

    Problem Description Avin is studying series. A series is called "wave" if the following co ...

  8. Scratch可视化的编程工具

    1.是什么? 在线编程网址 是一个编程软件,但是不涉及编程语言,是针对青少年开发的编程积木模块. 2.软件的目的是什么? 激发青少年对编程的兴趣 3.怎么用呢? 软件内部是很多积木模块,需要明白每块是 ...

  9. CentOS vim的使用

    安装vim工具 [root@bogon ~]# yum install -y vim-enhanced 卸载vim工具 [root@bogon ~]# yum remove -y vim* vim常用 ...

  10. Uncaught TypeError: Cannot set property onclick' of null

    如果出现以上问题,只需要把<script src="xxx.js"></script> 移动到最后,</body>的前面;