Соединение не поддерживает ошибку MultipleActiveResultSets при сохранении изменений в .net Core - PullRequest
0 голосов
/ 23 октября 2018

У меня есть исключение Middleware.И это записывает все ошибки в базу данных.Но, во-первых, он работал отлично, а во-вторых, выдает ошибку во время SaveChangesAsync для базы данных.В чем может быть причина этой ошибки.

Невозможно получить доступ к удаленному объекту.Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения.Это может произойти, если вы вызываете Dispose () для контекста или заключаете контекст в оператор using.Если вы используете внедрение зависимости, вы должны позволить контейнеру введения зависимости позаботиться об удалении экземпляров контекста.Имя объекта: 'MyDbContext'.

'Соединение не поддерживает MultipleActiveResultSets.'

MyDbContext.cs

public class MyDbContext : DbContext
{
    private readonly IAuditHelper auditHelper;

    public MyDbContext(DbContextOptions<MyDbContext> options, IAuditHelper auditHelper)
        : base(GetOptions())
    {
        this.auditHelper = auditHelper;
    }

    private static DbContextOptions GetOptions()
    {
        return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), "server=asdf; database=asdf; user id=asdf; password=asdf").Options;
    }

    public async Task<int> SaveChangesWithoutAuditAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        return (await base.SaveChangesAsync(true, cancellationToken));
    }
}

Запуск.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddScoped<IUnitOfWork, UnitOfWork>();
    services.AddScoped<IJwtHelper, JwtHelper>();
    services.AddScoped<IAuditHelper, AuditHelper>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddDbContext<MyDbContext>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor httpContextAccessor)
{
    app.ConfigureCustomExceptionMiddleware();

    app.UseHttpsRedirection();
    app.UseMvc();
}

ExceptionMiddleware.cs

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext, IUnitOfWork unitOfWork, IJwtHelper jwtHelper)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(httpContext, ex, unitOfWork, jwtHelper);
        }
    }

    private Task HandleExceptionAsync(HttpContext context, Exception exception, IUnitOfWork unitOfWork, IJwtHelper jwtHelper)
    {
        Log log = new Log();
        log.UserIp = jwtHelper.GetValueFromToken("UserIp");

        unitOfWork.LogRepo.AddOrUpdate(log);
        unitOfWork.CompleteAsync();

        return context.Response.WriteAsync(exception.Message);
    }
}

1 Ответ

0 голосов
/ 23 октября 2018

Я нашел проблему.Проблема заключается в методе HandleExceptionAsync.Он должен добавить aync и ждать так:

  private async Task HandleExceptionAsync(HttpContext context, Exception exception, IUnitOfWork unitOfWork, IJwtHelper jwtHelper)
    {
        Log log = new Log();
        log.UserIp = jwtHelper.GetValueFromToken("UserIp");

        unitOfWork.LogRepo.AddOrUpdate(log);
        await unitOfWork.CompleteAsync();
        await context.Response.WriteAsync(exception.Message);

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