创建角色的时候出现此错误
使用的相关代码为:
private static LMIdentityDbContext db; private RoleManager<IdentityRole> rm; public IdentityManager() { db = new LMIdentityDbContext();
//同步执行
//db.Configuration.LazyLoadingEnabled = false;
rm = new RoleManager<IdentityRole>(
new RoleStore< IdentityRole>(db)); }///
/// 角色创建时判断角色名或者角色ID在数据库中是否已经存在 同步判断
///
/// "role">
///
public bool RoleExists(ApplicationRole role)
{ if (rm.FindById(role.Id) != null) { return true; } return false; }使用的是RoleExists方法,来判断创建的角色名是否在数据库中已经存在,但是此判断未起作用
在controller中是使用如下代码判断:
else //角色添加
{
if (im.RoleExists(applicationRole)) { ModelState.AddModelError( "", "角色已经存在"); return View(applicationRole); } db.Roles.Add(applicationRole); db.SaveChanges(); }这里角色已存在的判断并没起作用。而直接在db.SaveChanges();报错
经过反复的测试,发觉使用异步判断角色名存在的方法可以获取正确的结果。
即这个方法起作用:
///
/// 角色创建时判断角色名或者角色ID在数据库中是否已经存在 异步判断
///
/// "role">
///
public async Task<bool> RoleExistsAsync(ApplicationRole role)
{ if ( await rm.FindByIdAsync(role.Id) != null) { return true; } return false; }通过反编译FindById方法获取的代码来看:
public static TRole FindById
{
if (manager == null)
{
throw new ArgumentNullException("manager");
}
return AsyncHelper.RunSync
}
FindById最终使用的仍然是FindByIdAsync方法,但是很显然AsyncHelper.RunSync这个异步变同步方法得过程当中出现了问题,
导致FindById方法不能获取正确的结果
到这里以为最终解决,但是整个流程编写完全又测试的时候发觉异步方法也不管用了,不起作用。
后来使用mvc的原生查询方法解决此问题
RoleExistsAsync最终改为下面的方式
///
/// 角色创建时判断角色是否已在存在 异步判断
///
/// "name">
///
public async Task<bool> RoleExistsAsync(string name)
{ //判断string sql = string.Format("select * from aspnetroles where name='{0}' ", name); var query = await db.Database.SqlQuery<ApplicationRole>(sql).FirstOrDefaultAsync(); if (query != null) { return true; } return false; }