实体框架代码使用默认SQL实例时的首次超时

时间:2014-01-30 10:32:08

标签: c# entity-framework sql-server-2012-express

使用Entity Framework连接到SQL Server 2012 Express默认实例时,我看到了奇怪的超时行为 - 在5.0.0和6.0.0上测试。

如果我使用服务器,通过IP地址,即离线,EF似乎忽略连接字符串中的任何超时值。

此连接字符串总是需要73秒才能超时:

<connectionStrings>
<add name="TestContext" connectionString="Server=10.0.0.2;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />

如果我添加端口,则需要42秒:

<connectionStrings>
<add name="TestContext" connectionString="Server=10.0.0.2,1433;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />

任何带有hostname的连接字符串都需要14秒,但如果DNS解析且主机处于脱机状态;或者在线主机没有SQL实例,它可以回到73秒,例如

<connectionStrings>
<add name="TestContext" connectionString="Server=dev-pc;Database=TestDb;User ID=sa;MultipleActiveResultSets=True;Connection Timeout=5" providerName="System.Data.SqlClient" />

我试过了:

context.Database.CommandTimeout = 5;

结果没有变化。这是预期的,因为它甚至没有进入查询。

这是我继承的DbContext类:

namespace Test.DataLayer
{
    public class TestContext: DbContext
    {
        public DbSet<Person> People { get; set; }           

        static TestContext()
        {
            Database.SetInitializer<TestContext>(null);
        }    

        public TestContext()
            : base("Name=TestContext"){}           
    }
}

问题:

这是预期的实体框架(或基础提供商)行为吗?

在这种情况下,它会超时?

由于73秒的超时时间过长,可以采取哪些措施来加快离线SQL主机的检测速度?

任何其他意见或建议将不胜感激。

谢谢,

弗朗索瓦

1 个答案:

答案 0 :(得分:0)

CommandTimeout 控制等待特定命令执行的时间(例如SELECT);当服务器无法访问且没有发送命令时,它不会产生任何影响。 尝试 ConnectionTimeout ,看看它是否有所不同。