我有两个数据库。
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实例?
答案 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)
{
...
}
}
但是,您真正需要做的是实现您自己的UserManagerFactory
版this 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);
}