4

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

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

我有以下 UserManager 类,我不确定如何访问基类“存储”

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 ...

谢谢

4

1 回答 1

4

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

以下是EF Code First DBContext 和 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 的用法。->如何在 Entity Framework 6 DbContext.Database.BeginTransaction 中配置事务超时?

更新 2:

使用 EF6 BeginTransaction:使用事务(EF6 以后)

使用以下伪代码

ApplicationDbContext ctx = new ApplicationDbContext();
using (DbContextTransaction tran1 = ctx.Database.BeginTransaction())
{
    using (MyDbContext ctx2 = new MyDbContext(ctx.Database.Connection, false))
    {
        ctx2.Database.UseTransaction(tran1.UnderlyingTransaction);
    }
}

使用事务(EF6 起)

注意:在这种情况下调用时,contextOwnsConnection 标志必须设置为 false。这很重要,因为它通知实体框架它在完成连接后不应关闭连接

于 2013-10-29T12:24:42.293 回答