异步方法上的C#实体框架错误
我已经看到了这一点,但我遇到了另一个问题 我有此服务类用于管理ASP.NET标识角色:异步方法上的C#实体框架错误,c#,.net,entity-framework,asynchronous,async-await,C#,.net,Entity Framework,Asynchronous,Async Await,我已经看到了这一点,但我遇到了另一个问题 我有此服务类用于管理ASP.NET标识角色: public class RoleService : IRoleService { private readonly RoleManager<ApplicationRole> _roleManager; public RoleService(RoleManager<ApplicationRole> roleManager) { this._ro
public class RoleService : IRoleService
{
private readonly RoleManager<ApplicationRole> _roleManager;
public RoleService(RoleManager<ApplicationRole> roleManager)
{
this._roleManager = roleManager;
}
public async Task<IdentityResult> CreateAsync(ApplicationRole role)
{
return await this._roleManager.CreateAsync(role);
}
}
但是,当执行等待时,这会导致错误。PopulateRoles()
实体框架:已经有一个与此命令关联的打开的DataReader,必须先关闭它
搜索此错误只会导致我建议在我的Select LINQ中添加一个
ToList()
。如何修复它?问题在于角色管理器
,它在内部被赋予一个DbContext
,我们可以看到:
这样,虽然您没有同时应用所有角色的好处,但仍然可以利用IO调用的异步特性,而不是阻塞同步调用。
RoleManager
实例不是线程安全的。多个CreateAsync
任务正在争夺同一连接。你应该用传统的串行方式来完成。我将以同步方式创建角色?是的,这就是我的建议。谢谢你的建议。我将等待其他人的评论(如果还有:D)如果您只有一个rolemager
实例,您将无法同时创建多个用户。这是个问题吗?您可以简单地使用foreach
和wait
对它们进行迭代吗?
private async Task PopulateRoles()
{
var roles = new[] { "A", "B", "C", "D" };
// Used LINQ foreach previously but I coded this way instead to follow the related questions's answer
var tasks = roles.Select(role =>
this._roleService.CreateAsync(new ApplicationRole(role)))
.ToList();
await Task.WhenAll(tasks);
}
public class RoleStore<TRole, TContext, TKey> :
IQueryableRoleStore<TRole>,
IRoleClaimStore<TRole>
where TRole : IdentityRole<TKey>
where TKey : IEquatable<TKey>
where TContext : DbContext
{
public RoleStore(TContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
Context = context;
}
}
private async Task PopulateRoles()
{
var roles = new[] { "A", "B", "C", "D" };
foreach (var role in roles)
{
await _roleService.CreateAsync(new ApplicationRole(role));
}
}