Добавление строки подключения в DBContext (NpgSQL, Dependency Injection, .NET Core) - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь динамически загрузить строку подключения и внедрить ее в мой унаследованный класс 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>();

Исключение:

Исключение при запуске приложения: Система.InvalidOperationException: невозможно разрешить службу для типа «System.String» при попытке активировать «MyDbContext».

1 Ответ

0 голосов
/ 28 января 2019

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

Принимающий конструкторстрока используется только вне внедрения зависимостей.

...