如何在ASP.NET Core中更改userManager的dbContext?

时间:2018-04-03 08:58:02

标签: c# entity-framework asp.net-core asp.net-identity

我有两个数据库。

  • application_db
  • registry_db

application_db 用于使应用程序正常工作并使用 ApplicationDbContext

registry_db 用于管理所有帐户。我想首先在我的注册服务上创建一个帐户,然后将创建的帐户(信息较少)插入应用程序数据库。 Registry_db正在使用 RegistryDbContext

我已经通过依赖注入成功地在我的注册表服务中注入了两个上下文(ApplicationDbContext& RegistryDbContext)。

我的初创公司看起来像这样:

services.AddCors();
services
.AddDbContext<RegistryDbContext>(
        options => options
        .UseNpgsql(
            Configuration.GetConnectionString("DefaultConnection"),
            b => b.MigrationsAssembly("Codeflow.Registry")
        )
    );

services
    .AddDbContext<ApplicationDbContext>(
    options => options
    .UseNpgsql(
            Configuration.GetConnectionString("ProductionConnection"),
        b => b.MigrationsAssembly("Codeflow.Registry")
    )
);

在我的注册表服务中,我可以通过依赖注入获取userManager并创建一个帐户。默认情况下,userManager使用RegistryDbContext。通过注册表服务成功创建帐户后,我想在 application_db (通过ApplicationDbContext)创建相同的帐户。但我陷入了这行代码

// first I am creating the account in registry_db
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{ 
    // once the account is created, I would like to create the account on application_db     
    // here I am getting the dbContext for the application_db
    // I can get it also over the dependency injection if needed
    using (ApplicationDbContext dbCtx = new ApplicationDbContext())
    {
         // Here I am getting the Error. The context is ok, but an error appeard with ApplicationUser.
         var test = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(dbCtx));
    }
}

我收到此错误消息:

  

错误:没有给出符合要求的参数   格式参数       'UserManager'的'optionsAccessor'。 UserManager(IUserStore,IOptions,   IPasswordHasher,   IEnumerable的&gt;中   IEnumerable&gt;,ILookupNormalizer,   IdentityErrorDescriber,IServiceProbider,   ILogger&GT)'

我的ApplicationUser类如下所示:

public class ApplicationUser : IdentityUser<Guid>
{
    public Guid GenderId { get; set; }
    [ForeignKey("GenderId")]
    public Gender Gender { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDay { get; set; }
}

有什么不对或丢失? 我已经尝试过关注这篇文章here,但没有运气。是否有其他方法可以创建具有其他上下文的userManager实例?

3 个答案:

答案 0 :(得分:1)

我认为你引用了错误的程序集。

其构造函数只接收一个参数UserStore的UserManager类不是ASP.Net Core UserManager,而是ASP.Net UserManager。请检查以下详细信息,

ASP.Net UserManager (Microsoft.AspNet.Identity.Core.dll): https://msdn.microsoft.com/en-us/library/dn468199(v=vs.108).aspx

ASP.Net核心UserManager (Microsoft.AspNetCore.Identity.dll,Microsoft.Extensions.Identity.Core.dll): https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.usermanager-1?view=aspnetcore-2.0

所以我的建议是,修复你的身份库参考。

答案 1 :(得分:0)

它是构造函数的依赖注入。使用DI,您不应直接初始化您的服务。您应该在Startup.cs注册您的服务和ApplicationContext。

当您需要服务时,应将其通过构造函数注入控制器,DI链将自动将ApplicationContext实例注入服务。

当然,如果您不需要为控制器中的每个方法提供服务,可以将其初始化为方法:

[Route("api/[controller]")]
public class MyController : Controller
{
    [HttpGet]
    public async IEnumerable<object> Get([FromServices] ApplicationContext context,
                                         MyType myMainParam)
    {
        ...
    }
}

但是,您真正需要做的是实现您自己的UserManagerFactorythis link可能会有所帮助。

this post也可能会有所帮助。

P.S:

@Singularity222帖子中查看this个答案。他在his repo中做了同样的事情。

我们还有this thread owner of Identity project(!)表示您需要实现自己的UserStore版本。

答案 2 :(得分:0)

using (var db = new TenantDBContext("connectionString"))
{
    db.Database.Migrate();
    var store = new UserStore<IdentityUser>(db);
    var user = new IdentityUser("test");
    var result = await store.CreateAsync(user);
}