创建DbCommand确实会从DBContext中分配超时

我有使用EF Core的ASP.NET Core 2.2应用程序。在startup.cs中,我将CommandTimeout设置为60秒

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

然后我正在使用以下代码执行存储的proc。请注意注释中的t1t2t3的值

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

我知道ConnectionTimeoutCommandTimeout不同。 但是问题是,当我使用connection.CreateCommand()创建命令时,它不会自动从DBContext获取超时

lookme123 回答:创建DbCommand确实会从DBContext中分配超时

EF Core在基础System.Data实现(在您的情况下为System.Data.SqlClient)之上工作,并使用它执行其数据库操作。您所做的所有设置只会反映EF使用此基础实现的方式。

使用GetDbConnection方法时,您会从SqlConnection程序集获得对System.Data.SqlClient类的引用,该程序集对EF及其设置一无所知,并且不能期望遵守{{ 1}}来自RelationalOptionsExtension.CommandTimeout程序集。

要尊重EF设置,您应该使用Microsoft.EntityFrameworkCore.Relational方法。

本文链接:https://www.f2er.com/3135406.html

大家都在问