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

时间:2013-06-11 16:21:36

标签: c# entity-framework entity-framework-5

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

为了做到这一点,我将dbContext对象转换为ObjectContext并访问CommandTimeout属性。

int ? currentCommandTimeout = ((IObjectContextAdapter)dbContext).ObjectContext.CommandTimeout;

此属性的当前值为null,表示当前命令超时是基础提供程序的默认值。

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

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

5 个答案:

答案 0 :(得分:18)

来自MSDN,

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

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

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

  

谁是基础提供者?

底层提供者是您在连接字符串中传递的providerName

<connectionStrings>
  <clear />
  <add name="Name" 
   providerName="System.Data.ProviderName" 
   connectionString="Valid Connection String;" />
</connectionStrings>

此处,System.Data.ProviderName是您的基础提供商。

如果您使用的是MySql或MS Sql,则根据MySql DocumentationMSDN

  • 默认值为30 secs
  • 值为0表示无限期等待,应避免使用。

    注意:

对于MySQL数据库提供程序,可以使用connectionstring属性Default Command Timeout更改默认命令超时。

答案 1 :(得分:4)

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

SqlCommand.CommandTimeout Property

答案 2 :(得分:4)

这应该有效

var ctx = new DbContext();
ctx.Database.CommandTimeout = 120;

答案 3 :(得分:3)

  
      
  1. 谁是基础提供者?
  2.   

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

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

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

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

  • MySQL的
  • SQL Server

在这两种情况下,我都看到在创建数据库上下文对象后,命令超时属性设置为null,这表明它使用的是基础提供程序提供的默认值。

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

如果将其设置回null,那么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 ! ");
            }
        }

如果未在连接字符串中设置任何内容,则MySQL的默认值为30。此处CommandTimeoutint,而非int?。所以EF确实应用了一些智能,同时暴露了EF最终通过dbContext.Database.CommandTimeout暴露的提供者类的这个属性。 EF只是这些提供者类的包装器,具有一些额外的智能。

关于连接叮咬的其他详细信息很少:

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

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

default command timeout=200;

答案 4 :(得分:1)

我就是这样做的。

var fs = require('fs');
var json = fs.readFileSync('./file.geojson', 'utf8', function (err, data) {
if (err) throw err;
});
var obj = JSON.parse(json);

var tags = [
obj.properties
];
var headers = 'name,number';

var output = headers + '\r\n';
for (var key in tags[0]){ // changed to tags[0]
  output += '"' + key + '",' + tags[key] + '\r\n'; 
}
console.log(output);