我正在尝试使用单个事务创建一个使用身份(UserManager)的用户,其中通过先前对服务的调用检索User.Id
。
ApplicationContext:
public class ApplicationContext : IdentityDbContext
Service
中的方法,其中Db上下文是通过注入传递的,将对象保存在表中并获取生成的唯一ID:
protected readonly ApplicationContext _applicationContext;
public Service(ApplicationContext applicationContext)
{
_applicationContext = applicationContext;
}
public async Task<long> CreateId()
{
var obj = new [....]
await _applicationContext.[....].AddAsync(obj);
await _applicationContext.SaveChangesAsync();
return obj.Id;
}
必须使用先前的ID在其中创建用户的Controller
:
(仅出于测试目的,代码始终调用事务的回滚)
public AuthController(UserManager<User> userManager, IService service)
{
_service = service;
_userManager = userManager;
}
void MethodToCreateUser()
{
using(var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
// Get an Id
var createdId = await _entityService.CreateId();
// Create a user with that Id
var user = new User{Id = createdId };
// Go
var result = await _userManager.CreateAsync(user, model.Password);
// Yes! I want to dispose it, just for test
scope.Dispose();
[....]
此TransactionScope
的使用在服务的CreateId
方法中返回此错误:
生成警告错误 'Microsoft.EntityFrameworkCore.Database.Transaction.AmbientTransactionWarning: 已检测到环境事务。当前提供者 不支持环境交易。
因此,我们来更改范围创建:
using(var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
这样,我在scope.Dispose()
行中收到此错误:
“必须将TransactionScope置于创建它的同一线程上。”
有什么想法可以使事务顺利运行吗?