您的位置:首页 > 编程语言 > ASP

不能在具有唯一索引 'RoleNameIndex' 的对象 'dbo.AspNetRoles' 中插入重复键的行

2016-11-24 17:44 344 查看
创建角色的时候出现此错误

使用的相关代码为:
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));
}

/// <summary>        /// 角色创建时判断角色名或者角色ID在数据库中是否已经存在  同步判断        /// </summary>        /// <param name="role"></param>        /// <returns></returns>        ​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();报错经过反复的测试,发觉使用异步判断角色名存在的方法可以获取正确的结果。即这个方法起作用:
/// <summary>       /// 角色创建时判断角色名或者角色ID在数据库中是否已经存在  异步判断       /// </summary>       /// <param name="role"></param>       /// <returns></returns>       public async Task<bool> RoleExistsAsync(ApplicationRole role){

          
   if (await rm.FindByIdAsync(role.Id) != null)
   {
        return true;
   }
   return false;
}  通过反编译FindById方法获取的代码来看:public static TRole FindById<TRole, TKey>(this RoleManager<TRole, TKey> manager, TKey roleId) where TRole : class, IRole<TKey> where TKey : IEquatable<TKey>
{
   if (manager == null)
   {
      throw new ArgumentNullException("manager");
   }
   return AsyncHelper.RunSync<TRole>(() => manager.FindByIdAsync(roleId));
}FindById最终使用的仍然是FindByIdAsync方法,但是很显然AsyncHelper.RunSync这个异步变同步方法得过程当中出现了问题,导致FindById方法不能获取正确的结果

到这里以为最终解决,但是整个流程编写完全又测试的时候发觉异步方法也不管用了,不起作用。

后来使用mvc的原生查询方法解决此问题
RoleExistsAsync最终改为下面的方式

/// <summary>       /// 角色创建时判断角色是否已在存在 异步判断       /// </summary>       /// <param name="name"></param>       /// <returns></returns>       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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvc
相关文章推荐