Я пытаюсь динамически загрузить строку подключения и ввести ее в мой унаследованный класс DbContext. Я не уверен, что делаю это правильно (все равно не могу заставить его работать).
Мой MyDbContext выглядит так:
public class MyDbContext : DbContext
{
private readonly string _connectionString;
public DbSet<Things> Things{ get; set; }
public MyDbContext (string connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(_connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ForNpgsqlUseIdentityColumns();
}
}
Мой стартап выглядит так:
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkNpgsql()
.AddDbContext<MyDbContext>(s => new MyDbContext("Host=192.168.0.1; Port=4016;Database=Test;Username=test;Password=test"))
.BuildServiceProvider();
services.AddMvc();
services.AddTransient<DbContext, MyDbContext>(s => new MyDbContext("Host=192.168.0.1; Port=4016;Database=Test;Username=test;Password=test"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>();
context.Database.Migrate();
}
}
Код выдает исключение в строке Configure(...):
var context = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>();
Исключение составляет:
Application startup exception: System.InvalidOperationException: Unable to resolve service for type 'System.String' while attempting to activate 'MyDbContext'.





В EF Core есть два способа инициализации DbContext — с помощью внедрения зависимостей или без него. Вы используете внедрение зависимостей, поэтому ваш DbContext должен предоставить конструктор, который принимает DbContextOptions<TContext> (см. ссылку на этот документ, как писал @ivan-stoev выше).
Конструктор, принимающий строку, используется только вне внедрения зависимостей.