不能在具有唯一索引 'RoleNameIndex' 的对象 'dbo.AspNetRoles' 中插入重复键的行
来源:互联网 发布:有马贵将 知乎 编辑:程序博客网 时间:2024/05/22 12:59
创建角色的时候出现此错误
使用的相关代码为:
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;}
- 不能在具有唯一索引 'RoleNameIndex' 的对象 'dbo.AspNetRoles' 中插入重复键的行
- 不能在具有唯一索引 '' 的对象 '' 中插入重复键的行
- 违反了 PRIMARY KEY 约束 'PK_TBL_Profiles'。不能在对象 'dbo.TBL_Profiles' 中插入重复键。
- 违反了 UNIQUE KEY 约束 'UNQ_CusID_DetachPolicyID'。不能在对象 'dbo.CustomerAccount' 中插入重复键。 语句已终止。 警告: 聚合或其
- 当您调用的 RDA 对象的拉方法时出现错误消息:"重复的值不能插入唯一索引。[表名 = __sysRDASubscriptions,约束名 = c_LocalTableName]"
- 11g不能在创建具有重复列的函数索引了
- mysql中的唯一键索引,插入重复数据直接报错的解决办法
- 因为发现对象名称 'dbo.T3' 和索引名称 'PK__T3__3214EC2706CC942B' 有重复的键,所以 CREATE UNIQUE INDEX 语句终止。重复的键值为 (1)。
- 因为发现对象名称 'dbo.T3' 和索引名称 'PK__T3__3214EC2706CC942B' 有重复的键,所以 CREATE UNIQUE INDEX 语句终止。重复的键值为 (1)。
- mongodb在重复数据的集合里建立唯一索引
- 结账时提示:不能在对象 't_Balance' 中插入重复键
- 数据库索引:唯一索引【便捷的无重复插入记录的方法(基于mysql)和索引设计思想小结】
- 在MySQL中 键名 索引 唯一 的概念分别是什么
- 在有重复数据的表上添加唯一索引的方法
- T3 记账提示不能在gl_mpostcond1_pk插入重复键的解决办法
- mysql 给有重复记录的表添加唯一索引
- 对于thinkphp唯一索引重复时出错的解决办法
- 对于有大量重复数据的表添加唯一索引
- awk fieldwidths
- Intellij IDEA 快捷键整理
- IOSWebView的使用以及WKWebView的使用
- 解决xcode8的快速注释失效
- 成都市武侯区创业路和九兴大道交汇处走丢一只狗狗
- 不能在具有唯一索引 'RoleNameIndex' 的对象 'dbo.AspNetRoles' 中插入重复键的行
- MFC中控件的运算处理
- win7共享配置
- emgu 图像列获取
- makefile的写法(怎么写makefile)
- Android数据存储和访问-登录记住密码功能
- Eclipse注释模板设置
- MVP+Dagger2+Retrofit实现更清晰的架构
- Exmobi之区别