Quantcast
Channel: ADO.NET, Entity Framework, LINQ to SQL, NHibernate
Viewing all articles
Browse latest Browse all 1698

Using EF as scoped service throws exception "A command is already in progress"

$
0
0

Using Npgsql EF data provider as scoped service throws exception.

To reproduce:

1. Configure ASP.NET 5 MVC Core application to use NpgSql EF provider as scoped service in StartUp.cs :>     public void ConfigureServices(IServiceCollection services)>         {>         services.AddHttpContextAccessor();>         services.AddScoped<MyDbContext>();>         ...

3. Use following method to get dynamic data as described in

https://github.com/dotnet/efcore/issues/1862#issuecomment-451671168

and in

https://stackoverflow.com/questions/55267883/efcore-fromsql-async

    partial class MyDbContext
    {
        async public Task<IEnumerable<T>> ExecQuery<T>(string sql, params object[] parameters) where T : class
        {
            using var db2 = new ContextForQueryType<T>(Database.GetDbConnection());
            var res = await db2.Set<T>().FromSqlRaw(sql, parameters).ToListAsync();
            return res;
        }
        class ContextForQueryType<T> : DbContext where T : class
        {
            readonly DbConnection connection;
            public ContextForQueryType(DbConnection connection)
            {
                this.connection = connection;
            }
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<T>().HasNoKey();
                base.OnModelCreating(modelBuilder);
            }
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseNpgsql(connection);
                base.OnConfiguring(optionsBuilder);
            }
        }
    }

Observed. Exception at line

    var res = await db2.Set<T>().FromSqlRaw(sql, parameters).ToListAsync();> Npgsql.NpgsqlOperationInProgressException (0x80004005): A command is> already in progress:    select ...> >    at> Npgsql.NpgsqlConnector.<StartUserAction>g__DoStartUserAction|233_0(<>c__DisplayClass233_0&> )    at Npgsql.NpgsqlConnector.StartUserAction(ConnectorState> newState, NpgsqlCommand command, CancellationToken cancellationToken,> Boolean attemptPgCancellation)    at> Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean> async, CancellationToken cancellationToken)    at> Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean> async, CancellationToken cancellationToken)    at> Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior> behavior, CancellationToken cancellationToken)    at> Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject> parameterObject, CancellationToken cancellationToken)> > ...


How to fix this so that scoped service can used ? Or is it reasonable to use Npgsql only as transient service in MVC Core application ?

                       

Viewing all articles
Browse latest Browse all 1698

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>