.net Core 2.1身份,与服务共享的交易

时间:2018-10-26 10:46:27

标签: .net-core transactionscope

我正在尝试使用单个事务创建一个使用身份(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置于创建它的同一线程上。”

有什么想法可以使事务顺利运行吗?

0 个答案:

没有答案