.Net Core 1.0.0-SDKプレビュー2(x64)
.Net Core 1.0.0-VS "15"プレビュー2(x64)
.Net Core 1.0.0-ランタイム(x64)
そのため、RC1アプリを上記の最新バージョンに更新しました。参照を何時間も切り替えた後、実行されています。ただし、(AccountController/Login)にログインすると、次の場所でエラーが発生します。
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);
}
次のエラーメッセージが表示されます。
InvalidOperationException:このDbContextにはデータベースプロバイダーが構成されていません。プロバイダーを構成するには、DbContext.OnConfiguringメソッドをオーバーライドするか、アプリケーションサービスプロバイダーでAddDbContextを使用します。 AddDbContextを使用する場合は、DbContext型がコンストラクターでDbContextOptionsオブジェクトを受け入れ、DbContextのベースコンストラクターに渡すことも確認してください。
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?}");
});
}
コンテキストは次のとおりです。
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);
}
AddDbContextを使用する場合は、DbContext型がコンストラクターでDbContextOptionsオブジェクトを受け入れ、DbContextのベースコンストラクターに渡すことも確認してください。
エラーメッセージは、DbContext
(LogManagerContext
)がDbContextOptions
を受け入れるコンストラクタを必要とすることを示しています。しかし、DbContext
にそのようなコンストラクターが見つかりませんでした。そのため、以下のコンストラクタを追加することで問題が解決する可能性があります。
public LogManagerContext(DbContextOptions options) : base(options)
{
}
コメントの編集
IHttpContextAccessor
を明示的に登録しない場合は、次のコードを使用します。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
接続文字列をDbContextOptionsBuilderに追加してMyContextの構成をオーバーライドすることで解決できました。
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);
}
}
これは私が見つけた解決策です。
AddDbContextを介してDBContextを構成する
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
}
DBContextクラスに新しいコンストラクターを追加します
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
:base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
コントローラーにコンテキストを注入する
public class MyController
{
private readonly BloggingContext _context;
public MyController(BloggingContext context)
{
_context = context;
}
...
}