dotnetcore / osharp

OSharp是一个基于.Net6.0的快速开发框架,框架对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、功能权限、数据权限等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net 框架更易于应用到实际项目开发中。
Apache License 2.0
2.76k stars 748 forks source link

提交事务后,工作单元和数据上下文无法重用 #283

Closed gmf520 closed 2 years ago

gmf520 commented 2 years ago

描述一下BUG

当一次请求当中,执行IUnitOfWork.Commit()提交事务后,(MySql中)无法进行数据查询,无法在进行数据CUD之后再次提交事务,这与原生EFCore的表现不符

重现步骤

例如,执行如下Action,在执行await manager.CreateAsync(new Role() { Name = "测试角色4" + token, Remark = "测试角色002描述" });时,MySql中会报异常The transaction associated with this command is not the connection’s active transaction

  [HttpPost]
  [Description("测试2")]
  public async Task<int> Test02()
  {
      IServiceProvider provider = HttpContext.RequestServices;
      string token = Guid.NewGuid().ToString("N").Substring(0, 5);
      RoleManager<Role> manager = provider.GetRequiredService<RoleManager<Role>>();
      await manager.CreateAsync(new Role() { Name = "测试角色3" + token, Remark = "测试角色描述" });
      await manager.CreateAsync(new Role() { Name = "测试角色4" + token, Remark = "测试角色描述" });

      return provider.GetRequiredService<RoleManager<Role>>().Roles.Count();
  }

原因分析

提交事务后,数据上下文仍带着已经释放的事务对象,导致后续的操作无法正常执行

解决方案