asp.net-identity 交易问题

Posted

技术标签:

【中文标题】asp.net-identity 交易问题【英文标题】:asp.net-identity transaction issue 【发布时间】:2015-02-06 06:31:34 【问题描述】:

我想在同一个事务中创建一个具有角色的用户,但我的实现有问题。为了在事务中使用 userStore 并且让它不自动保存更改并忽略我的事务,我不得不关闭 AutoSaveChanges。这使得它会等到我调用保存更改。这很好用,但是因为当我调用 manager.Create 时用户存储现在不返回 userId,因为它关闭了,所以我没有要传递给 userManager.AddToRole 的 ID。有什么方法可以将我尝试创建的用户添加到同一事务中的角色?

【问题讨论】:

【参考方案1】:

如果您手动启动事务,然后提交它,则在事务中写入数据库的所有内容都将保存在您的事务中。如果你愿意,你可以回滚它。

做这样的事情:

var dbContext = // get instance of your ApplicationDbContext
var userManager = // get instance of your ApplicationUserManager
using (var transaction = dbContext.Database.BeginTransaction(IsolationLevel.ReadCommitted))

    try
    
        var user = // crate your ApplicationUser
        var userCreateResult = await userManger.CreateAsync(user, password);
        if(!userCreateResult.Succeeded)
        
            // list of errors in userCreateResult.Errors
            transaction.Rollback();
            return userCreateResult.Errors;
        
        // new Guid for user now saved to user.Id property
        var userId = user.Id;

        var addToRoleresult = await userManager.AddToRoleAsync(user.Id, "My Role Name");
        if(!addToRoleresult.Succeeded)
        
            // deal with errors
            transaction.Rollback();
            return addToRoleresult.Errors;
        

        // if we got here, everything worked fine, commit transaction
        transaction.Commit();
    
    catch (Exception exception)
    
        transaction.Rollback();
        // log your exception
        throw;
    

希望这会有所帮助。

【讨论】:

如果 dbContext 与用于创建 ApplicationUserManager 实例的上下文不同怎么办?这还能用吗? @nmit026 理论上事务是数据库级别的操作,所以它应该与两个dbContexts一起工作,但我从未尝试过。可能上面创建的事务是连接级事务;并且两个 dbContext 将有两个不同的连接,因此在此基础上可能无法正常工作。对于您的情况,也许应该以不同的方式开始交易:using(TransactionScope tran = new TransactionScope()) // do work; tran.Complete(); 在此处查看更多信息:***.com/a/224702/809357 @nmit026 请记住,Identity 在所有地方都使用async,因此需要在创建事务范围时牢记这一点:var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled) 谢谢!或许你可以看看我今天问的这个问题:***.com/questions/36636272/…

以上是关于asp.net-identity 交易问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET-Identity 限制 UserNameIndex 长度

Asp.NET Identity 2 给出“无效令牌”错误

js 技巧 JS代码判断集锦(之一)

Rust 宏可以创建新的标识符吗?

Circom 2.0: A Scalable Circuit Compiler

iOS--当cell上显示不同数量图片的时候重用