Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'No database provider has been configured for this DbContext' on SignInManager.PasswordSignInAsync

.Net Core 1.0.0 - SDK Preview 2 (x64)

.Net Core 1.0.0 - VS "15" Preview 2 (x64)

.Net Core 1.0.0 - Runtime (x64)

So, we updated an RC1 app to the latest versions above. After many hours of switching references, it's running. However, when logging in (AccountController/Login), I am getting an error at:

public class AccountController : BaseController {     public UserManager<ApplicationUser> UserManager { get; private set; }     public SignInManager<ApplicationUser> SignInManager { get; private set; }     private readonly IEmailSender EmailSender;      public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, IEmailSender emailSender)     {         UserManager = userManager;         SignInManager = signInManager;         EmailSender = emailSender;     }      // GET: /Account/Login     [HttpGet]     [AllowAnonymous]     public IActionResult Login(string returnUrl = null)     {         ViewBag.ReturnUrl = returnUrl;         return View();     }      //     // POST: /Account/Login     [HttpPost]     [AllowAnonymous]     [ValidateAntiForgeryToken]     public async Task<IActionResult> Login(ViewModels.Account.LoginViewModel model, string returnUrl = null)     {         if (ModelState.IsValid)         {             // Errs this next line             var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false); // <-- ERRS HERE '.PasswordSignInAsync'             if (result.Succeeded)                 return RedirectToLocal(returnUrl);              ModelState.AddModelError("", "Invalid email or password.");             return View(model);         }          // If we got this far, something failed, redisplay form         return View(model);     }              

It blows up with the following error message:

InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext.

Here is the Startup.cs:

public void ConfigureServices(IServiceCollection services)     {         services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));          // Add EF services to the services container.         services.AddEntityFrameworkSqlServer()            .AddDbContext<LogManagerContext>(options =>               options.UseSqlServer(Configuration["Data:DefaultConnection:Connectionstring"]));          services.AddSingleton(c => Configuration);          // Add Identity services to the services container.         services.AddIdentity<ApplicationUser, IdentityRole>()             .AddEntityFrameworkStores<LogManagerContext>()             .AddDefaultTokenProviders();                               // Add MVC services to the services container.         services.AddMvc();          services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();          //Add all SignalR related services to IoC. - Signal R not ready yet - Chad         //services.AddSignalR();          //Add InMemoryCache         services.AddMemoryCache();          services.AddSession(options =>         {             options.IdleTimeout = System.TimeSpan.FromHours(1);             options.CookieName = ".LogManager";         });          // Uncomment the following line to add Web API servcies which makes it easier to port Web API 2 controllers.         // You need to add Microsoft.AspNet.Mvc.WebApiCompatShim package to project.json         // services.AddWebApiConventions();         // Register application services.         services.AddTransient<IEmailSender, AuthMessageSender>();              }      // Configure is called after ConfigureServices is called.     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)     {         app.UseSession();          // Configure the HTTP request pipeline.         // Add the console logger.         //loggerFactory.MinimumLevel = LogLevel.Information; - moved to appsettings.json -chad         loggerFactory.AddConsole();         loggerFactory.AddDebug();          loggerFactory.AddNLog();          // Add the following to the request pipeline only in development environment.         if (env.IsDevelopment())         {             app.UseBrowserLink();             app.UseDeveloperExceptionPage();             //app.UseDatabaseErrorPage(DatabaseErrorPageOptions.ShowAll);         }         else         {             // Add Error handling middleware which catches all application specific errors and             // sends the request to the following path or controller action.             app.UseExceptionHandler("/Home/Error");         }          env.ConfigureNLog("NLog.config");          // Add static files to the request pipeline.         app.UseStaticFiles();          // Add cookie-based authentication to the request pipeline.         app.UseIdentity();          //SignalR         //app.UseSignalR();          // Add MVC to the request pipeline.         app.UseMvc(routes =>         {             routes.MapRoute(              name: "default",              template: "{controller}/{action}/{id?}",              defaults: new { controller = "Home", action = "Index" }              );              // Uncomment the following line to add a route for porting Web API 2 controllers.             // routes.MapWebApiRoute("DefaultApi", "api/{controller}/{id?}");         });     } 

And here's the Context:

public class ApplicationUser : IdentityUser {     // Add Custom Profile Fields     public string Name { get; set; } }  public class LogManagerContext : IdentityDbContext<ApplicationUser> {     public DbSet<LogEvent> LogEvents { get; set; }     public DbSet<Client> Clients { get; set; }     public DbSet<LogEventsHistory> LogEventsHistory { get; set; }     public DbSet<LogEventsLineHistory> LogEventsLineHistory { get; set; }     public DbSet<LogRallyHistory> LogRallyHistory { get; set; }     public DbSet<Flag> Flags { get; set; }     protected override void OnModelCreating(ModelBuilder builder)     {          builder.Entity<LogEvent>().HasKey(x => x.LogId);         builder.Entity<LogEvent>().ToTable("LogEvents");         builder.Entity<Client>().HasKey(x => x.ClientId);         builder.Entity<Client>().ToTable("Clients");         builder.Entity<LogEventsHistory>().HasKey(x => x.HistoryId);         builder.Entity<Flag>().HasKey(x => x.FlagId);         builder.Entity<Flag>().ToTable("Flags");         builder.Entity<LogRallyHistory>().HasKey(x => x.HistoryId);         builder.Entity<LogEventsLineHistory>().HasKey(x => x.LineHistoryId);          base.OnModelCreating(builder);     } 
like image 319
Beau D'Amore Avatar asked Jul 12 '16 20:07

Beau D'Amore


People also ask

How to configure database provider for DbContext?

A provider can be configured by overriding the DbContext. OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext.

What is Efcore?

Entity Framework (EF) Core is a lightweight, extensible, open source and cross-platform version of the popular Entity Framework data access technology. EF Core can serve as an object-relational mapper (O/RM), which: Enables . NET developers to work with a database using . NET objects.

What is dbContextOptions?

The dbContextOptions carries the configuration information needed to configure the DbContext. The dbContextOptions can also be configured using the OnConfiguring method. This method gets the DbContextOptionsBuilder as its argument. It is then used to create the dbContextOptions.


2 Answers

If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext.

The error message says your DbContext(LogManagerContext ) needs a constructor which accepts a DbContextOptions. But I couldn't find such a constructor in your DbContext. So adding the below constructor probably solves your problem.

public LogManagerContext(DbContextOptions options) : base(options) { } 

Edit for comment

If you don't register IHttpContextAccessor explicitly, use below code:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();  
like image 97
adem caglin Avatar answered Sep 21 '22 04:09

adem caglin


I could resolve it by overriding Configuration in MyContext through adding connection string to the DbContextOptionsBuilder:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)     {         if (!optionsBuilder.IsConfigured)         {             IConfigurationRoot configuration = new ConfigurationBuilder()                .SetBasePath(Directory.GetCurrentDirectory())                .AddJsonFile("appsettings.json")                .Build();             var connectionString = configuration.GetConnectionString("DbCoreConnectionString");             optionsBuilder.UseSqlServer(connectionString);         }     } 
like image 23
MohammadSoori Avatar answered Sep 23 '22 04:09

MohammadSoori