tutorial net español asp c# entity-framework asp.net-core asp.net-identity-3

c# - net - ''No se ha configurado ningún proveedor de base de datos para este DbContext'' en SignInManager.PasswordSignInAsync



asp.net core 2.1 identity (2)

Si se usa AddDbContext, asegúrese también de que su tipo DbContext acepte un objeto DbContextOptions en su constructor y lo pase al constructor base para DbContext.

El mensaje de error dice que su DbContext ( LogManagerContext ) necesita un constructor que acepte un DbContextOptions . Pero no pude encontrar tal constructor en tu DbContext . Así que agregar el constructor a continuación probablemente resuelva tu problema.

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

Editar para comentar

Si no registra IHttpContextAccessor explícitamente, use el siguiente código:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

.Net Core 1.0.0 - SDK Preview 2 (x64)

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

.Net Core 1.0.0 - Tiempo de ejecución (x64)

Por lo tanto, hemos actualizado una aplicación RC1 a las últimas versiones anteriores. Después de muchas horas de cambiar las referencias, se está ejecutando. Sin embargo, al iniciar sesión (AccountController / Login), recibo un error en:

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); }

Se infla con el siguiente mensaje de error:

InvalidOperationException: no se ha configurado ningún proveedor de base de datos para este DbContext. Se puede configurar un proveedor anulando el método DbContext.OnConfiguring o usando AddDbContext en el proveedor de servicios de la aplicación. Si se usa AddDbContext, asegúrese también de que su tipo DbContext acepte un objeto DbContextOptions en su constructor y lo pase al constructor base para DbContext.

Aquí está el 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?}"); }); }

Y aquí está el contexto:

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); }


Podría resolverlo anulando la Configuración en MyContext agregando una cadena de conexión a 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); } }