Transactions / Database.BeginTransaction和IdentityManager

时间:2013-10-29 12:01:43

标签: asp.net-identity

我有一个复杂的添加过程来创建用户(并将角色+其他用户相关信息添加到其他表)

在添加用户/角色或其他Identity对象时,是否有人知道如何使用事务。我似乎无法访问“Database.BeginTransaction”

我有以下UserManager类,我不知道如何访问基类“store”

public class UserManager : UserManager<ApplicationUser>
{
    public UserManager()
    : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        //allows alphanumeric names in username
        UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }

}

似乎没有办法访问UserManager.UserStore.Database ...

由于

1 个答案:

答案 0 :(得分:4)

ASP.NET Identity框架的当前存储实现使用EntityFramework。 DbContext是EF的核心,其中TransactionScope可用于保存多个更改。

以下是EF Code First DBContext and Transactions

的示例
using(var scope = new TransactionScope(TransactionScopeOption.Required,
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
    // Do something like Add a User 
    context.SaveChanges();
    // Do something like Add a User to Role
    context.SaveChanges();

    scope.Complete();
}

更新1: - 要访问DbContext.Database,请使用IdentityManager.Store.Context.Database - 您可以使用相同的ConnectionString(而不是SqlConnection对象)在多个DbContext中使用相同的方法

此外,请查看BeginTransaction用法的下一个链接。 - &GT; How do you configure the Transaction time out in Entity Framework 6 DbContext.Database.BeginTransaction?

更新2:

使用EF6 BeginTransaction:Working with Transactions (EF6 Onwards)

使用以下代码伪

ApplicationDbContext ctx = new ApplicationDbContext();
using (DbContextTransaction tran1 = ctx.Database.BeginTransaction())
{
    using (MyDbContext ctx2 = new MyDbContext(ctx.Database.Connection, false))
    {
        ctx2.Database.UseTransaction(tran1.UnderlyingTransaction);
    }
}
来自Working with Transactions (EF6 Onwards)

  

注意:在此方案中调用contextOwnsConnection标志时必须设置为false。这很重要,因为它通知实体框架它不应该在完成连接时关闭连接