EF 6与Asp.Net.Identity调用AddToRole时触发并发异常求助
问题描述
我正在开发一款MVC5 Web应用,采用的技术栈如下:
- Asp.Net.Identity.Core (2.2.3)
- DevArt MySQL驱动
- DevArt MySql Identity (8.21.2066.0)
- EF 6框架
在执行将用户添加至角色的操作时,我遇到了并发异常问题,触发异常的具体代码段为:var result1 = UserManager.AddToRole(user.Id, "Admin");
异常详情
抛出的异常类型为System.Data.Entity.Infrastructure.DbUpdateConcurrencyException,异常核心提示为:Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded.,完整堆栈跟踪信息如下:
System.Data.Entity.Infrastructure.DbUpdateConcurrencyException HResult=0x80131501 Message=Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions. Source=mscorlib StackTrace: at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.EntityFramework.UserStore`6.<SaveChanges>d__61.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.EntityFramework.UserStore`6.<UpdateAsync>d__40.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.UserManager`2.<UpdateAsync>d__74.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.UserManager`2.<AddToRoleAsync>d__105.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.AsyncHelper.RunSync[TResult](Func`1 func) at DEV_Art_Test_2.Startup.createRolesandUsers() in E:\REPOS\Devart\NET Test 2\DEV Art Test 2\Startup.cs:line 50 at DEV_Art_Test_2.Startup.Configuration(IAppBuilder app) in E:\REPOS\Devart\NET Test 2\DEV Art Test 2\Startup.cs:line 15
复现代码
我在Startup类中编写了数据库种子数据初始化逻辑,完整代码如下:
public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); createRolesandUsers(); } // 初始化默认用户角色和管理员登录账号 private void createRolesandUsers() { ApplicationDbContext context = new ApplicationDbContext(); var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); // 创建Admin角色和默认超级管理员用户 if (!roleManager.RoleExists("Admin")) { // 第一步创建Admin角色 var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole(); role.Name = "Admin"; roleManager.Create(role); // 创建站点管理员账号 var user = new ApplicationUser(); user.UserName = "bob"; user.Email = "test@test.com"; string userPWD = "Test1234"; var chkUser = UserManager.Create(user, userPWD); // 曾尝试手动将对应实体状态设置为Modified后执行保存,仍然触发相同异常 //context.Entry(chkUser).State = System.Data.Entity.EntityState.Modified; //context.SaveChanges(); // 将创建完成的默认用户绑定到Admin角色 if (chkUser.Succeeded) { var result1 = UserManager.AddToRole(user.Id, "Admin"); } } // 创建Manager角色 if (!roleManager.RoleExists("Manager")) { var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole(); role.Name = "Manager"; roleManager.Create(role); } // 创建Employee角色 if (!roleManager.RoleExists("Employee")) { var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole(); role.Name = "Employee"; roleManager.Create(role); } } }
已尝试操作
我曾尝试手动将用户实体状态标记为Modified后再调用保存方法,依然会触发相同的并发异常,需要排查当前代码存在的问题。
内容的提问来源于stack exchange,提问作者Bob Randolph
相关产品推荐
相关产品推荐

