EF6 +存储过程=超时异常

时间:2015-04-09 09:59:38

标签: c# sql-server stored-procedures entity-framework-6

我的环境是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执行第一个查询时,他正在构建查询执行计划,这需要很长时间。但我找不到超时异常的原因

0 个答案:

没有答案