我的环境是VS 2012,C#,EF6和SQL Server 20012。
我有一个存储过程:
ALTER PROCEDURE MyName
@Param1 int,
@Param2 bit,
@param3 bit,
@param4 uniqueidentifier
AS
它使用选择,更新,删除命令。
在服务器端,我使用*.edmx
模型和EF 6.x EntityObject生成器
超时15秒
ObjectContext.MyName(param1, param2, param3, param4);
如果我使用SQL Server Management Studio,那么存储过程会在1-3秒内执行,如果我使用EF6,我会收到超时异常。
我将超时设置为60,90,120秒甚至更多,但它没有帮助。
有人可以帮忙吗?我该怎么办?
更新1:
我抓住了:EntityCommandExecutionException
执行命令定义时发生错误。有关详细信息,请参阅内部异常。
内部异常:
"超时(超时)。操作完成之前经过的超时时间或服务器没有响应。
它呼叫SP:
[EnableClientAccess()]
[RequiresAuthentication()]
public partial class MyService : OCEntityService<MyEntities>
{
public override string DBName
{
get { return "MyDbName"; }
}
public new string EntityConnectionString
{
get
{
EntityConnectionStringBuilder ecsb =
new EntityConnectionStringBuilder(this.ConnectionString)
{
Metadata =
"res://*/Entities.Model.csdl|res://*/Entities.Model.ssdl|res://*/Entities.Model.msl",
};
ecsb.ProviderConnectionString += "MultipleActiveResultSets=True;";
return ecsb.ConnectionString;
}
}
protected override MyEntities CreateObjectContext()
{
return new MyEntities(EntityConnectionString);
}
public void DeleteObject()
{
ObjectContext.MyName(param1, param2, param3, Guid.NewGuid());
ObjectContext.SaveChanges();
}
}
更新2
我的连接字符串
metadata=res://*/Entities.Model.csdl|res://*/Entities.Model.ssdl|res://*/Entities.Model.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=MyDb;persist security info=False;user id=user;workstation id=localhost;packet size=4096;max pool size=500;network library=dbmssocn;MultipleActiveResultSets=True;MultipleActiveResultSets=True;"
我发现了以下内容:
我在foreach
:
foreach (var item in items)
{
try
{
DeleteObject(item.Id, param2, param3, Guid.NewGuid());
}
catch (Exception ex)
{
To log...
}
}
...
public void DeleteObject(...)
{
ObjectContext.MyName(param1, param2, param3, Guid.NewGuid());
ObjectContext.SaveChanges();
}
我设置超时= 600
对于第一项,存储过程执行45-55秒(我在SQL Server Profiler中看到)并且所有数据都已删除或更新,但我得到上述异常。其他项目毫无例外地执行2-3秒。
我发现问题如下:
当Sql执行第一个查询时,他正在构建查询执行计划,这需要很长时间。但我找不到超时异常的原因