Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net Core中保存更改时,连接不支持MultipleActiveResultSets错误_C#_Asp.net Core - Fatal编程技术网

C# 在.net Core中保存更改时,连接不支持MultipleActiveResultSets错误

C# 在.net Core中保存更改时,连接不支持MultipleActiveResultSets错误,c#,asp.net-core,C#,Asp.net Core,我有例外的中间件。并将所有错误记录到数据库中。但是,当第一次工作时,它工作得很好,但在第二次尝试时,在saveChangesSync到数据库的过程中给了我错误。这一错误的原因可能是什么 无法访问已处置的对象。此错误的常见原因是处理从依赖项解析的上下文 然后尝试在应用程序的其他地方使用相同的上下文实例。如果您 正在对上下文调用Dispose(),或将上下文包装到using语句中。如果使用依赖项注入, 您应该让依赖项注入容器处理上下文实例。 对象名称:“MyDbContext”。 该连接不支持多个活

我有例外的中间件。并将所有错误记录到数据库中。但是,当第一次工作时,它工作得很好,但在第二次尝试时,在saveChangesSync到数据库的过程中给了我错误。这一错误的原因可能是什么

无法访问已处置的对象。此错误的常见原因是处理从依赖项解析的上下文 然后尝试在应用程序的其他地方使用相同的上下文实例。如果您 正在对上下文调用Dispose(),或将上下文包装到using语句中。如果使用依赖项注入, 您应该让依赖项注入容器处理上下文实例。 对象名称:“MyDbContext”。

该连接不支持多个活动结果集。

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));
    }
}

我发现了问题。问题是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 ;
    }
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);
    }
}
  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 ;
    }