2016-07-12 8 views
17

.Net Rdzeń 1.0.0 - SDK Preview 2 (64)'Brak dostawcy baza danych została skonfigurowana na tym DbContext' na SignInManager.PasswordSignInAsync

.Net Rdzeń 1.0.0 - VS "15" Preview 2 (64)

.Net Rdzeń 1.0.0 - Runtime (x64)

Dlatego zaktualizowaliśmy aplikację RC1 do najnowszych wersji wyżej. Po wielu godzinach przełączania referencji działa. Jednak podczas logowania (AccountController/login), otrzymuję komunikat o błędzie na stronie:

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

on wysadza z następującym komunikatem o błędzie:

InvalidOperationException: Brak dostawcy baza danych została skonfigurowana dla tego DbContext. Dostawcę można skonfigurować, zastępując metodę DbContext.OnConfiguring lub używając AddDbContext w dostawcy usług aplikacji. Jeśli zostanie użyty AddDbContext, upewnij się, że Twój typ DbContext akceptuje obiekt DbContextOptions w swoim konstruktorze i przekazuje go do konstruktora bazowego dla DbContext.

Oto 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?}"); 
     }); 
    } 

A oto kontekst:

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

Odpowiedz

30

Jeżeli stosuje AddDbContext, potem także upewnić się, że typ DbContext akceptuje DbContextOptions obiekt w swoim konstruktorze i przekazuje go do podstawowym konstruktorem dla DbContext.

Komunikat o błędzie mówi Twój DbContext (LogManagerContext) potrzebuje konstruktor, który akceptuje DbContextOptions. Ale nie mogłem znaleźć takiego konstruktora w twoim DbContext. Dodanie poniższego konstruktora prawdopodobnie rozwiązuje twój problem.

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

Edycja dla komentarza

Jeśli nie zarejestrować IHttpContextAccessor wyraźnie, skorzystaj z poniższego kodu:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
+0

ok, więc dodałem to do LogManagerContext.cs i teraz dostaję inny błąd z jeszcze mniejszą informacją: InvalidOperationException: HttpContext nie może mieć wartości null. get_Context I nadal nie mogę wejść do metody .PasswordSignInAsync ani –

+1

Czy możesz spróbować zarejestrować IHttpContextAccessor? zobacz https://github.com/aspnet/Mvc/issues/3936 –

+0

services.AddSingleton (); services.AddSingleton (); dodanie tego do Startup.cs poprawiono. Dzięki.Jeśli chcesz odświeżyć ten link, zaznaczę go jako odpowiedź. –

4

mogę go rozwiązać poprzez nadpisanie konfiguracji w MyContext poprzez dodanie ciąg połączenia 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); 
     } 
    } 
+0

Miło, zapomniałem może najważniejsza linia: 'optionsBuilder.UseSqlServer (connectionString);' – mkb

Powiązane problemy