不能在具有唯一索引 'RoleNameIndex' 的对象 'dbo.AspNetRoles' 中插入重复键的行
2016-11-24 17:44
344 查看
创建角色的时候出现此错误
使用的相关代码为:
}
/// <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的原生查询方法解决此问题
/// <summary> /// 角色创建时判断角色是否已在存在 异步判断 /// </summary> /// <param name="name"></param> /// <returns></returns> public async Task<bool> RoleExistsAsync(string name){
//判断
使用的相关代码为:
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; }
相关文章推荐
- [Err] 23000 - [SQL Server]不能在具有唯一索引 'IX_student_info_2' 的对象 'dbo.student_info' 中插入重复键的行
- 不能在具有唯一索引“IX_******”的对象“dbo.****”中插入重复键的行。重复键值为 (110, 372000, 2)。
- 当您调用的 RDA 对象的拉方法时出现错误消息:"重复的值不能插入唯一索引。[表名 = __sysRDASubscriptions,约束名 = c_LocalTableName]"
- 不能在具有唯一索引 '' 的对象 '' 中插入重复键的行
- [待解决]违反了 PRIMARY KEY 约束 'T_FileType_PK'。不能在对象 'dbo.T_FileType' 中插入重复键。语句已终止。
- 违反了 PRIMARY KEY 约束 'PK_TBL_Profiles'。不能在对象 'dbo.TBL_Profiles' 中插入重复键。
- 违反了 UNIQUE KEY 约束 'UNQ_CusID_DetachPolicyID'。不能在对象 'dbo.CustomerAccount' 中插入重复键。 语句已终止。 警告: 聚合或其
- 11g不能在创建具有重复列的函数索引了
- Mysql存在唯一索引条件下,实现插入如果重复则自动更新
- 数据库索引:唯一索引【便捷的无重复插入记录的方法(基于mysql)和索引设计思想小结】
- MySQL批量插入遇上唯一索引避免方法(避免导入重复数据)
- MySQL建立唯一索引实现插入重复自动更新
- 使用Entity Framwork 保存数据时,提示不能在对象中插入重复键,违反了PRIMARY_KEY约束
- 如何解决Oracle“不能创建唯一索引,发现重复记录”问题
- 因为发现对象名称 'dbo.T3' 和索引名称 'PK__T3__3214EC2706CC942B' 有重复的键,所以 CREATE UNIQUE INDEX 语句终止。重复的键值为 (1)。
- 在唯一密钥属性“value”设置为“default.aspx”(或者index.asp等)时,无法添加类型为“add”的重复集合项
- ###Springmvc封装复杂表单数据:表单提交多个实体类的参数【对象类型参数,自动封装】name属性值不能重复。和实体类属性名一致
- sql 违反了 PRIMARY KEY 约束,不能在对象 中插入重复键
- 如何解决Oracle“不能创建唯一索引,发现重复记录”问题
- 违反了PRIMARY KEY约束不能在对象中插入重复 + 当IDENTITY_INSERT 设置为 OFF 时,不能向表 中的标识列插入显式值。