我有两个数据库。
- application_db
- 注册表_DB
application_db 用于应用程序进行工作并使用 ApplicationDbContext 。
Registry_db 用于管理所有帐户。我想先通过我的注册表服务创建一个帐户,然后将创建的帐户(信息更少(插入应用程序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使用registristrydbcontext。一旦通过注册表服务成功创建帐户后,我想在 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的"选项"。Usermanager(iuserstore,ioptions, ipasswordhasher, ienumerable>, ienumerable>,iLookupnormalizer, IdentityErrordescriber,IserviceProbider, ilogger>('
我的应用程序器类看起来像这样:
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; }
}
有什么问题或缺少什么?我已经尝试在这里关注这篇文章,但没有运气。是否有其他方法可以创建具有其他上下文的UserManager实例?
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);
}
它是对构造变量的依赖性注入。使用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
版本,此链接可能会有所帮助。
这篇文章也可能会有所帮助。
P.S:
查看此线程中的 @Singularity222答案。他在他的仓库中做了您想做的同样的事情。
也有此线程,身份项目的所有者(!(说您需要实现自己的UserStore
版本。
我认为您是在引用错误的组件。
其构造函数仅收到一个参数的UserManager类不是ASP.NET核心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 core usermanager (microsoft.aspnetcore.identity.dll,microsoft.extensions.inderity.core.core.dll(:https://lealen.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.sideity.usermanager-1?view= aspnetcore-2.0
所以我的建议是,修复您的身份库的引用到使用.NET Core One。