【问题标题】:What leads to mySQL command concurrency issue with DataReader in ASP.Net Core, and how do I resolve it?是什么导致 ASP.Net Core 中的 DataReader 出现 mySQL 命令并发问题,我该如何解决?
【发布时间】:2020-09-16 02:15:46
【问题描述】:

我刚刚将我的应用程序从 ASP.Net Core 2.2 迁移到 3.1,我有一个我不明白的错误。这是一个相当简单的 MVC 应用程序,带有一个 mySQL DB,我正在使用 EF Core - Identity 来管理他们所谓的“基于策略”的授权,也就是“基于声明的”身份验证。

主要的类/模型是家庭配置文件。给定的用户可以对不同的家庭有 2 个级别的索赔 - 他们可以是父母或看护人。用户仪表板视图显示了一些列表:任何父母家庭中的孩子列表、父母家庭授权的看护人列表以及看护人家庭列表。

这是将所有信息发送到视图的控制器代码。问题是foreach循环在浏览器中产生错误:

“InvalidOperationException:当该命令有打开的 DataReader 时无法设置 MySqlCommand.CommandText;必须先将其关闭。”

仅当用户与家庭有看护者关系时才会发生这种情况,因为条件会阻止您输入 foreach,但我的部分困惑是为什么这是这个循环中的一个问题,而我似乎正在制作其他地方对数据库的请求非常相似。

我查看了this questionthis one,似乎第二个更相关,所以我尝试添加await 部分并在foreach 循环中使查询方法异步(它只是1 行),但它没有解决问题。也许我把它放在错误的地方?第一个问题帮助我了解了幕后发生的事情,但我不知道我会在代码中的哪个位置实际实现它。

提前感谢您的帮助!

   public async Task<ActionResult> Index()
{
  var userId = this.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
  var currentUser = await _userManager.FindByIdAsync(userId);
  var userFamilies = (_db.Families.Where(entry => (entry.ParentId == currentUser.Id))).ToList();

  if (_db.Caregivers.Select(entry => (entry.CaregiverId == currentUser.Id)) != null)
  {

    var userCareFamilies = new List<Family>();
    var careFamilies = _db.CaregiverFamilies
    .Where(c => c.CaregiverId == currentUser.Id);
    if (careFamilies.Count() != 0)
    {
      foreach (CaregiverFamily cf in careFamilies)
      {
        var thisFamily = await _db.Families.FirstOrDefaultAsync(f => f.FamilyId == cf.FamilyId);
        userCareFamilies.Add(thisFamily);
      }
    }
    ViewBag.CareFamilies = userCareFamilies;
  }

【问题讨论】:

标签: c# mysql asp.net-core asp.net-core-3.1 sqldatareader


【解决方案1】:

问题出在这一行:

var careFamilies = _db.CaregiverFamilies
.Where(c => c.CaregiverId == currentUser.Id);

因为您没有具体化查询(通过ToList 等),所以它在您遍历结果时保持连接打开。

尝试使用

var careFamilies = _db.CaregiverFamilies
.Where(c => c.CaregiverId == currentUser.Id).ToList();

附带说明,您正在混合使用 Async (FirstOrDefaultAsync) 和 Sync (ToList) 方法。我建议坚持一个或另一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2012-10-25
    • 2020-04-22
    • 2021-04-09
    • 2021-11-14
    • 1970-01-01
    • 2018-07-01
    • 2018-03-03
    相关资源
    最近更新 更多