“此 DbContext 没有配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或使用 AddDbContext 在应用程序服务提供程序上配置提供程序。如果使用了 AddDbContext,则还需确保您的 DbContext 类在其构造函数中接受 DbContextOptions 对象,并将其传递给 DbContext 的基类构造函数。”
DbContext类:
public class CustomerManagerContext : IdentityDbContext<User, Role, long, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{
public CustomerManagerContext() { }
public CustomerManagerContext(DbContextOptions<CustomerManagerContext> options) : base(options)
{
}
//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
//{
// base.OnConfiguring(optionsBuilder);
// optionsBuilder.UseSqlServer("SecretConnectionString");
//}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>().ToTable("Users");
builder.Entity<Role>().ToTable("Roles");
builder.Entity<UserClaim>().ToTable("UserClaims");
builder.Entity<UserRole>().ToTable("UserRoles");
builder.Entity<UserLogin>().ToTable("UserLogins");
builder.Entity<RoleClaim>().ToTable("RoleClaims");
builder.Entity<UserToken>().ToTable("UserTokens");
}
}
Startup Class - ConfigureServices Method
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<CustomerManagerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
);
services.AddEntityFrameworkSqlServer()
.AddDbContext<CustomerManagerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<User, Role>()
.AddEntityFrameworkStores<CustomerManagerContext>()
.AddDefaultTokenProviders();
}
AddDbContext
和AddEntityFrameworkSqlServer
(并且在这里还调用了UseSqlServer
)听起来完全不对。尝试注释掉对AddEntityFrameworkSqlServer
的调用。 - Camilo Terevinto.AddDbContext
和AddEntityFrameworkSqlServer
,只需移除AddEntityFrameworkSqlServer
即可。我怀疑是因为它们都注册了两个DbContextOptionsBuilder
实例,当依赖注入尝试通过provider.GetRequiredService<T>()
解析它时,如果存在多个注册,它就会失败。多个注册只能通过GetRequiredServices
(复数形式)来解决。 - Tseng