【问题标题】:Exception - "This MySqlConnection is already in use" when using MYSql server. However the same Linq query works fine with MS SQL Server例外 - 使用 MYSql 服务器时“此 MySqlConnection 已在使用中”。但是,相同的 Linq 查询适用于 MS SQL Server
【发布时间】:2021-04-22 14:06:09
【问题描述】:

我正在使用 .NET Core 框架 (5.0) 开发质量保证应用程序。最初,我使用了 MS SQL Server DB,它运行良好。但是,现在由于需求变化,我现在已经转移到 MYSQL Server。

我已经使用代码优先方法(实体框架)成功地集成了数据库。另外,我正在使用 NuGet 包 Pomelo.EntityFrameworkCore.MySql 并且一切正常,除了下面提到的 Linq 查询我遇到异常 - 这个 MySqlConnection 已经在使用中强>.

public List<ErrorMessage> GetErrorMessage(int productId)
{
    List<ErrorMessage> localList = new List<ErrorMessage>();
    var product = _db.Products.Where(a => a.ProductId == productId).FirstOrDefault();
    if (product != null)
    {

        var products = _db.Products
            .Where(q => q.ProductName.ToLower() == product.ProductName.ToLower()).Select(e => e.ProductId);
        foreach (var item in products)
        {
            var errormessage = _db.ErrorMessageTracks.Where(q => q.ProductId == item).Select(e => e.ErrorMessage);
            foreach (var msg in errormessage)
            {
                if (!localList.Select(q => q.ErrorMessageId).Contains(msg.ErrorMessageId))
                {

                    localList.Add(msg);
                }
            }
        }

    }
    return localList;
}

我已经提到了其他类似的问题,但我无法解决这个问题,因为我不确定如何关闭 SQL 连接,因为我使用的是 Linq Query 而不是实际的 SQL Join。任何帮助将不胜感激!

【问题讨论】:

  • 这听起来像是这个方法之外的问题 - 你如何实例化你的数据库上下文,是否有可能在上面的调用堆栈中调用异步方法而不是等待?
  • 这可能与 MySql .NET 连接器无法支持 MultipleActiveResultSets 有关。见stackoverflow.com/questions/25953560/…
  • 您可以检查在 var products 初始化的末尾添加一个 .ToList() 是否会改变一些东西
  • @Steve,我添加了 ToList() 并且它有效。谢谢你。 :)
  • 但是,测量性能。 ToList 将查询具体化,您可以取回整个数据集,而以前的版本使用逐条记录的方法。也许您可以在两个查询之间创建一个 JOIN 并完全避免这两个查询。

标签: c# mysql asp.net-core entity-framework-core pomelo-entityframeworkcore-mysql


【解决方案1】:

您可以在 linq 查询的末尾添加ToList(),它应该可以解决问题:

var products = _db.Products.Where(q => q.ProductName.ToLower() == product.ProductName.ToLower())
                           .Select(e => e.ProductId).ToList();

【讨论】:

    【解决方案2】:

    添加Tolist() 以获取外部for产品 将立即执行查询并允许内部for 的连接可用以获取项目.

    【讨论】:

    • 这可能最好作为评论发布
    猜你喜欢
    • 2019-05-06
    • 2021-12-19
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多