2013-10-29 64 views
4

我有一個複雜的添加過程中創建用戶(並增加了角色+其他用戶相關信息到其它表)交易/ Database.BeginTransaction和IdentityManager

有誰知道如何添加用戶/角色時使用事務或其他Identity對象。我似乎無法訪問「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

ASP.NET身份框架目前的存儲實現使用的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可以使用相同的方法在多個的DbContext(不SqlConnection對象)

此外,請查看使用BeginTransaction的下一個鏈接。 - >How do you configure the Transaction time out in Entity Framework 6 DbContext.Database.BeginTransaction?

更新2:

使用EF6的BeginTransaction:以下代碼僞

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。這很重要,因爲它告訴實體框架,它不應該關閉連接時,它不應該關閉連接

+0

對不起,我的問題是,我試圖跨兩個上下文這樣做,因此我需要使用新功能EntityFramework 6和「BeginTransaction」 - 據我所知。 –

+0

您可以使用相同的ConnectionString(而不是SqlConnection對象)跨多個DbContext使用相同的方法。 – jd4u

+0

我已更新我的問題...我似乎無法找到IdentityManager.Store ?? –