Доступ к NPGSQL в Startup.cs с помощью DI - PullRequest
2 голосов
/ 28 июня 2019

Использование .NET Core 2.1, NPGSQL, Entity Framework и Linux.

Из функции конфигурации Startups.cs я вызываю функцию в классе с внедрением зависимостей, который, в свою очередь, вызывает другой класс с внедрением зависимостей, который обращается кБД с использованием Entity Framework + NPGSQL.

Настройка служб:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFrameworkNpgsql()
        .AddDbContext<MMContext>(options => options.UseNpgsql($"Host='localhost'; Port=1234;Database='mydb';Username='test';Password='test'"))
        .BuildServiceProvider();
        services.AddTransient<IMusicManager, MusicManager>();
        services.AddTransient<IMusicRepo, MusicRepo>();

      services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

Настройка функции:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();

        using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
        {
            var mm = scope.ServiceProvider.GetRequiredService<IMusicManager>();
            mm.DoSomeDBStartupStuff();
        }
    }

IMusicManager

Реализация выглядит следующим образом:

    private readonly IMusicRepo _musicStoreRepo;
    public MusicManager(IMusicRepo musicStoreRep)
    {
        _musicStoreRepo = musicStoreRepo;
    }

    public void DoSomeDBStartupStuff()
    {
        _musicStoreRepo.InsertSampleStuff();
        _musicStoreRepo.CheckThisAndCheckThat();
    }

IMusicRepo

Реализация выглядит следующим образом:

    private readonly MMContext _context;
    public MusicRepo(MMContext context)
    {
        _context = context;
    }

    public void InsertSampleStuff()
    {
        _context.Music.AddAsync(new music("abc"));
        _context.Music.AddAsync(new music("123"));
        _context.SaveChangesAsync();
    }

MMContext

Это реализовано так:

public class MMContext : DbContext
{
    public MMContext(DbContextOptions<MMContext> options) : base(options) {}
    ... OnModelCreating etc...
}

Я получаю это исключение при запуске:

Исключение при запуске приложения: System.InvalidOperationException: Reset () вызывается для соединителя с состоянием Выполняется в Npgsql.NpgsqlConnector.Reset () в Npgsql.ConnectorPool.Release (соединитель NpgsqlConnector) в Npgsql.NpgsqlConnection.Close (Boolean waspggs)Dispose (BoolНапример, в System.ComponentModel.Component.Dispose () в Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Dispose () в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.Dispose () в Microsoft.EteteDespose.Microsoft.Extensions.DependencyInjection.ServiceLookup.- в Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure (приложение IApplicationBuilder) в Microsoft.AspNetCore.HostFilteringStartupFilter. <> c__DisplayClass0_0.b__0 (приложение IApplicationBuilder) в Microsoft.AspNetCore.play_0) в Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication ()

Я не уверен, что является причиной проблемы.Возможно, как я использую Dependency Injection и как я использую прицел?Помощь оценена.

1 Ответ

1 голос
/ 28 июня 2019

Обнаружение асинхронных вызовов, не ожидаемых в функции void.

public void InsertSampleStuff()
{
    _context.Music.AddAsync(new music("abc"));
    _context.Music.AddAsync(new music("123"));
    _context.SaveChangesAsync();
}

Это может вызвать проблемы с многопоточностью DbContext при попытке сохранить эти изменения.

Либо сделайте функцию асинхронной и ожидайте этих вызовов должным образом, либо используйте синхронный API

public void InsertSampleStuff() {
    _context.Music.Add(new music("abc"));
    _context.Music.Add(new music("123"));
    _context.SaveChanges();
}

Если вы идете по асинхронному маршруту, подумайте о том, чтобы переместить этот установочный код в размещенную службу и должным образом ожидать его там

Справочная информация Фоновые задачи с размещенными службами в ASP.NET Core

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...