Asp.Net Identity用户管理器和工作单元-如何匹配它们

本文关键字:何匹配 单元 工作 Identity Net 用户 管理器 Asp | 更新日期: 2023-09-27 18:13:02

我正在使用工作单元模式,并在一个名为MyProject的单独子项目中为其定义了一个类。领域DAL。工作单位。

不幸的是,整个ASP。Net Identity基础设施在我的主要项目(如教程中所述(MyProject中。

更麻烦的是:据我所知,ASP。NET标识使用自己的DBContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ApplicationDbContext"/> class, using the EFDB context.
    /// </summary>
    public ApplicationDbContext()
        : base("EFDBContext", throwIfV1Schema: false)
    {
    }
    /// <summary>
    /// Creates this instance.
    /// </summary>
    /// <returns>A database context</returns>
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

我有一个名为Project的类,它应该有一个与它相关联的用户,但如何做到这一点,而不使用冲突的数据库上下文?

示例:

public class Project
{
   public ApplicationUser User {get; set;}
}

示例调用代码:

public class IndexController : Controller
{
    // uow and userManager are instantiated through Ninject
    // example code, normally this would be properties of the controller
    public ActionResult Create(IUnitOfWork uow, ApplicationUserManager userManager, int someID )
    {
       Project newProject = new Project(); 
       ApplicationUser user = await UserManager.FindByIdAsync(someID);
       // this should give a conflict, since two different DataContexts are involved
       newProject.User = user;
       uow.Projects.Insert(newProject);
       uow.Save()
       return this.View();
    }
}

}

Asp.Net Identity用户管理器和工作单元-如何匹配它们

模板有点令人困惑。您不应该创建单独的自己的DbContext,而应该使用数据模型的其余部分来扩展现有的ApplicationDbContext。只要更改IdentityConfig.cs中的类型,就可以将其移动到项目中的其他位置。

然而,当使用工作单元时,有一个更难解决的问题,那就是ASP。NET Identity方法在内部调用SaveChanges(),当使用工作单元时,通常只需要在完成所有工作后才调用。一个变通方法可以是使用TransactionScope(),但在ASP的每个请求DbContext之前创建它可能会很麻烦。NET Identity使用。