我有一个复杂的添加过程来创建用户(并将角色+其他用户相关信息添加到其他表)
在添加用户/角色或其他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 ...
由于
答案 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。这很重要,因为它通知实体框架它不应该在完成连接时关闭连接