我正在将旧会员系统转移到Identity Core RC1。我从旧系统中为每个角色提取了许多声明(最多50个或更多),我需要在新系统中创建相应的角色和相关声明。 问题是当我遍历声明时将它们添加到这样的角色:
await RoleManager.AddClaimAsync(role, claim)
系统会向数据库持续存在一些声明(有时为2次,有时为7次或更多次),然后返回错误:
不允许使用新事务,因为会话中还有其他线程在运行。
或者有时会出现这种错误:
mscorlib.dll中出现'System.AggregateException'类型的异常
其中有4个级别的InnerException,最后一个说:
BeginExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。
使用AddClaimAsync有什么问题吗?我一直在疯狂,无法找到出路。有什么建议吗?
这是代码: - 自定义RoleManager:
public class EMSRoleManager : RoleManager<EMSRole>
{
public EMSRoleManager(IRoleStore<EMSRole> store, IEnumerable<IRoleValidator<EMSRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<EMSRole>> logger, IHttpContextAccessor contextAccessor) : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
{
}
}
在Startup.cs中:
services.AddIdentity<EMSUser, EMSRole>()
.AddRoleManager<EMSRoleManager>()
.AddEntityFrameworkStores<ApplicationDbContext, Guid>();
在我正在使用的服务类中,我注入如下:
private UserManager<EMSUser> _userManager;
private LegacyIdentityContext _legacyDb;
private EMSRoleManager _roleManager;
public LoginService(UserManager<EMSUser> userManager, LegacyIdentityContext legacyIdentity, EMSRoleManager roleManager )
{
_userManager = userManager;
_legacyDb = legacyIdentity;
_roleManager = roleManager;
}
然后,根据声明列表,我使用它将它们添加到角色中:
for (int i = 0; i < claims.Count; i++)
{
await _roleManager.AddClaimAsync(newRole, claims[i]);
}
这是它破裂的地方。 谢谢你的帮助。