You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:51:16