实体框架 - 当前命令超时值是什么

Ore*_*ren 20 c# entity-framework entity-framework-5

我正在使用Entity Framework 5,我希望知道命令超时值.

为此,我将dbContext对象转换为ObjectContext,然后访问CommandTimeout属性.

int ? currentCommandTimeout = ((IObjectContextAdapter)dbContext).ObjectContext.CommandTimeout;
Run Code Online (Sandbox Code Playgroud)

此属性的当前值为null,这意味着当前命令超时是基础提供程序的默认值.

  1. 谁是底层提供者?
  2. 在这种情况下,如何读取(通过EF代码)当前命令超时值?

MSDN ObjectContext CommandTimeout属性参考

编辑:感谢您解释如何设置命令超时并在文档中查找默认命令超时值.但问题仍未解决.如果可能,如何在默认情况下通过EF读取命令超时值.

Bhu*_*ake 19

来自MSDN,

  • CommandTimeout属性获取或设置所有对象上下文操作的超时值(以秒为单位).
  • null值表示基础提供的默认值将被使用.

因此,如果您没有通过代码显式设置它或在连接字符串中传递它(在MySQL中),那么它是您的提供者的默认值.

如果要查看非空值CommandTimeout,则需要在connectionString中传递它或通过代码设置它.

谁是底层提供者?

底层提供者是您在connectionstring中传递的提供者 providerName

<connectionStrings>
  <clear />
  <add name="Name" 
   providerName="System.Data.ProviderName" 
   connectionString="Valid Connection String;" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

在这里,System.Data.ProviderName是您的基础提供商.

如果您使用的是MySql或MS Sql,根据MySql文档MSDN,

  • 默认值为30 secs.
  • 值0表示无限期等待,应该避免.

    注意 :

对于Default Command TimeoutMySQL数据库提供程序,可以使用connectionstring属性更改缺省命令超时.

  • -1这正是OP写的问题(他甚至提供了一个链接).并且它不回答谁是底层提供者,以及如何获得当前超时值 (3认同)
  • 我不同意这一点 - "如果你想查看CommandTimeout的值,那么你需要在connectionString中传递它.**你在连接字符串中提供的是连接超时和NOT命令超时.**连接超时和命令超时是不同的事情.**永远不能通过连接字符串**设置命令超时.没有这样的属性可以在SQL Server支持的连接字符串格式中设置.见[here](http://www.connectionstrings.com/all-sql-server-connection-string-keywords/).只能通过C#代码中的命令对象设置命令超时. (3认同)
  • 谢谢Bhushan.但是,这仍然没有回答我的问题.如何通过代码读取值? (2认同)

Jas*_*sey 6

如果您使用 SQLServer,则默认命令超时为 30 秒。

SqlCommand.CommandTimeout 属性

  • 谢谢杰森。我知道默认值应该是 30。但是,问题仍然存在。默认情况下,如何通过 Entity Framework 5 代码读取此值。 (4认同)

afr*_*fr0 5

这应该工作

var ctx = new DbContext();
ctx.Database.CommandTimeout = 120;
Run Code Online (Sandbox Code Playgroud)


RBT*_*RBT 5

  1. 谁是底层提供者?

要远程连接到任何数据库并触发 SQL 查询,您需要一种机制或中介(可以说),它了解触发查询时要采取的各种操作的通信语义,例如创建命令、建立连接、处理连接超时,重试等

所有这些职责都由您尝试连接的数据库的提供程序负责。这些提供程序将有不同的实现和类 wrt 您正在连接的环境(C#、Java、Python、Perl 等)。因此,要连接到 MySQL 数据库,您将拥有用于 java、.net 或 python 编程世界的不同提供程序。

  1. 在这种情况下,如何读取(通过 EF 代码)当前命令超时值?

不。这不可能。如果您仔细查看该dbContext.Database.CommandTimeout属性,它的类型为int?。因此,将此属性保持为可空 int 的逻辑只是表示默认值(作为 null)。在 C# 代码中设置显式值之前,实体框架 (EF) 不会公开任何内容。我根据以下数据库对此进行了验证

  • MySQL
  • 数据库服务器

在这两种情况下,我看到在创建 DB 上下文对象后,命令超时属性被设置为null表明它正在使用底层提供程序提供的默认值。

但是是的,如果您在 C# 代码中通过dbContext.Database.CommandTimeout属性将其设置为非空值,那么您当然可以再次读取它,因为它是命令对象上的 get-set 属性。它将始终向您显示在代码中明确设置的新值。

如果您将其重新设置为nullEF ,则 EF 将再次开始使用基础提供程序的默认超时。

使用提供程序类代替 EF 层:如果您不使用实体框架的 ORM 层而是使用提供程序的核心类,那么您当然可以看到初始化本身的默认超时值。就像当我运行下面提到的MySQL数据库代码时,默认命令超时值已经在连接字符串本身中设置,然后你会看到 40。

private static void TestingCommandTimeOutInMySql()
        {
            string connetionString = "Server=localhost;Database=sakila;Uid=root;Pwd=Passw0rd;default command timeout=40;";
            MySqlConnection con = new MySqlConnection(connetionString);
            try
            {
                cnn.Open();
                Console.WriteLine("Connection Open ! ");
                MySqlCommand cmd = new MySqlCommand("select * from actor", con);
                var timeoutValue = cmd.CommandTimeout; //shows 40
                con.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Can not open connection ! ");
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果您没有在连接字符串中设置任何内容,它会显示 MySQL 的默认值 30。这里CommandTimeoutint,不是int?。因此,EF 在公开提供程序类的此属性时确实应用了一些智能,这些提供程序类最终由 EF 通过dbContext.Database.CommandTimeout. EF 只是这些提供程序类的包装器,具有一些额外的智能。

关于连接刺的一些额外细节:

对于 SQL Server 提供程序: Microsoft SQL Server 连接字符串格式不提供任何属性,您可以借助这些属性设置自定义命令执行超时。因此,在 SQL Server 提供程序的初始化过程中设置一个值是不可能的。尽管在初始化/初始化之后,您始终可以更改 C# 代码中的值。您可以在此处查看更多详细信息。

对于 MySQL Provider: 我的 SQL 连接字符串格式支持显式设置默认命令超时。您可以在此处找到详细信息。您可以在 MySQL 连接字符串中提及自定义默认命令超时值,如下所示 -

default command timeout=200;
Run Code Online (Sandbox Code Playgroud)