.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); }
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.
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.
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.
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>();
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); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With