У меня есть следующий класс в приложении NET Core2.0.
// required when local database does not exist or was deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
public AppContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
return new AppContext(builder.Options);
}
}
Это требуется в Core 2.0 с миграцией, когда база данных не существует и должна быть создана при запуске базы данных обновлений.
Невозможно создать миграцию после обновления до ASP.NET Core 2.0
Я бы не хотел иметь ConnectionString в 2-х местах (здесь и в appsettings.json), но только в .json поэтому я попытался заменить
"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
с
ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
но он не работает, я получаю нулевое значение.
ОБНОВЛЕНИЕ 1:
Просто отметим, что добавление явно .json не требуется в Core 2, поэтому проблема не в файле.
https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/
ОБНОВЛЕНИЕ 2:
Также я уже использую Configuration для отправки ConnectionString из .json в контекст:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
Но я не могу использовать это для ToDoContextFactory, потому что у него нет конфигурации, а ToDoContextFactory используется для миграции, поэтому приложение не работает вообще.
РЕШЕНИЕ: Основываясь на ответе от @JRB, я сделал это так:
public AppContext CreateDbContext(string[] args)
{
string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin\" }, StringSplitOptions.None)[0];
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(projectPath)
.AddJsonFile("appsettings.json")
.Build();
string connectionString = configuration.GetConnectionString("DefaultConnection");
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer(connectionString);
return new AppContext(builder.Options);
}