Создание DbCommand получает тайм-аут, назначенный из DBContext - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть приложение ASP.NET Core 2.2, использующее EF Core. В файле startup.cs я устанавливаю CommandTimeout на 60 секунд

services.AddDbContext<CrowdReason.WMP.Data.Entities.WMPContext>(options => 
   options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"),
                  sqlServerOptions => sqlServerOptions.CommandTimeout(60)));

Затем я выполняю сохраненный процесс, используя следующий код. Обратите внимание на значения t1, t2 и t3 в комментариях

    public static async Task<int?> prcDoWork(this WMPContext dbContext, int id, int userID)
    {
        var t1 = dbContext.Database.GetCommandTimeout();            
        // t1 is 60. Same as what i set in startup.cs

        using (var connection = dbContext.Database.GetDbConnection())
        {
            var t2 = connection.ConnectionTimeout;                                
            //t2 is 15

            using (var cmd = connection.CreateCommand())
            {                    
                var p1 = new SqlParameter("@ID", SqlDbType.Int)
                {
                    Value = id
                };
                var p2 = new SqlParameter("@UserID", SqlDbType.Int)
                {
                    Value = userID
                };
                cmd.CommandText = "dbo.prcDoWork";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(p1);
                cmd.Parameters.Add(p2);

                var t3 = cmd.CommandTimeout;
                //t3 is 30

                await dbContext.Database.OpenConnectionAsync().ConfigureAwait(false);
                var result = await cmd.ExecuteScalarAsync().ConfigureAwait(false);
                if (result != null)
                {
                    return Convert.ToInt32(result);
                }

                return null;
            }
        }
    }

Я понимаю, что ConnectionTimeout отличается от CommandTimeout. Однако проблема в том, что когда я создаю команду, используя connection.CreateCommand(), она не получает автоматически тайм-аут из DBContext

...