mysql in use_This MySqlConnection is already in use

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

6ddca6997335385f14c045889f249021.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()会报错呢?

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

还是没找到什么答案。

42d1c425e1b7b8e52fb0d8236ae911c5.png

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

总结

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

foreach (var item in menus)

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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值