【发布时间】:2014-01-30 10:32:07
【问题描述】:
使用实体框架连接到 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" />
并且任何带有主机名的连接字符串都需要 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 主机的速度?
任何其他的 cmets 或建议将不胜感激。
谢谢,
弗朗索瓦
【问题讨论】:
标签: c# entity-framework sql-server-2012-express