gpt4 book ai didi

c# - 从 2.2 迁移到 3.1 后 EF Core 出现问题

转载 作者:行者123 更新时间:2023-12-04 10:46:36 25 4
gpt4 key购买 nike

在 2.2 中我可以这样写:

        List<Claim> claims = new List<Claim>();
var userRoles = await _userManager.GetRolesAsync(user);
foreach (var role in _roleManager.Roles.Where(a => userRoles.Contains(a.Name)))
{
claims.AddRange(await _roleManager.GetClaimsAsync(role));
}

return claims;

在 3.1 中它给了我这个错误:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.

但是如果我添加

ToList()

对于 forEach 子句,它工作正常(像这样):

        List<Claim> claims = new List<Claim>();
var userRoles = await _userManager.GetRolesAsync(user);
foreach (var role in _roleManager.Roles.Where(a => userRoles.Contains(a.Name)).ToList())
{
claims.AddRange(await _roleManager.GetClaimsAsync(role));
}

return claims;

我应该更改代码中所有使用类似结构的地方,还是有办法让 EF 正常工作?

最佳答案

因为_roleManager.Roles.Where(a => userRoles.Contains(a.Name) 创建了一个 IEnumerator,当它尝试

再次执行 await _roleManager.GetClaimsAsync(role).. 它看到它已经有一个打开关联的DataReader

3.0 可能做了一个内部在客户端自动评估 LINQ 表达式 有点像自动 Tolist(),而不是 IEnumerator保持连接打开。

为了避免这种情况,我将在下面对所有 future 和当前的代码进行处理。这样没关系,还要确保不执行重新执行整个语句的 IEnumerator 语句。

此外,这还有一个额外的好处,即您可以在循环之前调试列表。

在有人说这会消耗更多内存之前,请给我一个测试,显示...这不使用 yield,而且编译器可能足够聪明,可以对它认为不需要的任何内容进行优化。

这里他们对 IEnumerator 问题的表述更好,但同样如此。

Entity Framework upgrade to 6.2.0 from 6.1.x breaks certain queries unless I enable MARS

List<Claim> claims = new List<Claim>();
var userRoles = await _userManager.GetRolesAsync(user);
//you could change this to use async and await
//var roles = await _roleManager.Roles.Where(a => userRoles.Contains(a.Name)).ToListAsync();
var roles = _roleManager.Roles.Where(a => userRoles.Contains(a.Name)).ToList();
foreach (var role in roles)
{
claims.AddRange(await _roleManager.GetClaimsAsync(role));
}

return claims;

关于c# - 从 2.2 迁移到 3.1 后 EF Core 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com