【发布时间】: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 question 和this 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