Entity Framework에서 데이터베이스 시간 초과 설정


164

명령 시간이 초과되어 기본 명령 시간 제한 값을 변경해야합니다.

찾았 myDb.Database.Connection.ConnectionTimeout지만 readonly.

Entity Framework 5 에서 명령 시간 초과를 어떻게 설정할 수 있습니까?


20
참고로, EF6에서 Database.CommandTimeout더 이상 읽기 전용이 아닙니다
itsho

2
@itsho 그는 이야기하고 있었다 Database.Connection.ConnectionTimeout. 어쨌든, Database.CommandTimeout귀하의 쿼리가 시간 초과되는 경우 (을 System.Data.Entity.Core.EntityCommandExecutionException포함하는 예외 System.Data.SqlClient.SqlException: Timeout expired.) 인 것이 옳습니다 .
David Ferenczy Rogožan


1
실제로 연결 시간 초과는 신경 쓰지 않지만 대신 명령 시간 초과를 조정하려고합니다.
Worthy7

답변:


199

상황에 따라 시도하십시오.

public class MyDatabase : DbContext
{
    public MyDatabase ()
        : base(ContextHelper.CreateConnection("Connection string"), true)
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
    }
}

연결 문자열에서 시간 초과를 정의 Connection Timeout하려면 다음 연결 문자열과 같은 매개 변수를 사용하십시오 .

<connectionStrings>

<add name="AdventureWorksEntities"
connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60;
multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />

</connectionStrings>

출처 : 방법 : 연결 문자열 정의


1
ObjectContext이 생성자에서 에 액세스하려는 것처럼 연결 문자열 버전을 사용하는 것이 좋습니다. 때때로 PowerShell / NuGet 콘솔 명령이 순환 방식으로 실패 합니다.
Kevin Gorski

130
연결 시간 초과 및 CommandTimeout 및 두 가지 개별 항목. 연결 문자열 설정 인 Connection Timeout은 명령 실행 시간 (CommandTimeout)에 영향을 미치지 않습니다.
Clay Lenhart

3
내 문제는 조금 다르다. 마이그레이션하는 동안 시간이 초과되었습니다. EF는 마이그레이션 중에 사용하기 위해 비슷한 속성을 설정합니다. msdn.microsoft.com/en-us/library/…
Karsten

2
사용하는 EF 버전에 따라 CommandTimeout 속성을 지정하는 방법에 대한 다른 API에 대한 느낌을 얻으려면 이 답변 을 참조하십시오 .
Jim Aho

1
나를 위해 작동하지 않습니다 (연결 대 명령이 의심되는 것과 동일하지 않음). 이 게시물은 stackoverflow.com/questions/6232633/entity-framework-timeouts를
Jezbers

181

당신이 사용할 수있는 DbContext.Database.CommandTimeout = 180;

매우 간단하고 캐스트가 필요하지 않습니다.


1
Fluent APIEF 형식 을 사용하는 우리에게 매우 유용합니다 .
GoldBishop

20

내 부분적인 내용은 다음과 같습니다.

public partial class MyContext : DbContext
{
    public MyContext (string ConnectionString)
        : base(ConnectionString)
    {
        this.SetCommandTimeOut(300);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }
}

나는 왼쪽 SetCommandTimeOut그래서에만 루틴 공공 나는 오랜 시간 (5 분 이상) 내가 대신 글로벌 타임 아웃의 수정을해야합니다.


9

생성 된 생성자 코드에서 호출해야합니다. OnContextCreated()

이 부분 클래스를 추가하여 문제를 해결했습니다.

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}

8

유창한 구현으로 Ronnie의 답변을 확장하여 다음과 같이 사용할 수 있습니다.

dm.Context.SetCommandTimeout(120).Database.SqlQuery...

public static class EF
{
    public static DbContext SetCommandTimeout(this DbContext db, TimeSpan? timeout)
    {
        ((IObjectContextAdapter)db).ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;

        return db;
    }

    public static DbContext SetCommandTimeout(this DbContext db, int seconds)
    {
        return db.SetCommandTimeout(TimeSpan.FromSeconds(seconds));
    } 
}

8

데이터베이스 우선 Aproach의 경우 :

ContextName.Context.tt T4 템플릿을 다음과 같이 재정 의하여 생성자에서 설정할 수 있습니다 .

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
        Database.CommandTimeout = 180;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}

Database.CommandTimeout = 180; acutaly 변화입니다.

생성 된 출력은 다음과 같습니다.

public ContextName() : base("name=ContextName")
{
    Database.CommandTimeout = 180;
}

데이터베이스 모델을 변경해도이 템플릿은 그대로 유지되지만 실제 클래스는 업데이트됩니다.


구성 파일을 사용하여 템플릿에서 시간 초과를 지정할 수있는 방법이 있습니까?
shas

1
확실하지 않은 것이 있다면 (내가 무언가를 찾을 수 없었습니다). 그러나 180을 하드 코딩하는 대신 System.Configuration.ConfigurationManager.AppSettings["keyname"]@shas
Christian Gollhardt를

7

다른 답변과 동일하지만 확장 방법 :

static class Extensions
{
    public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
    {
        db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
    }
}

이 확장 메서드를 어떻게 호출합니까?
Wanderson López

1

방금이 문제가 발생하여 응용 프로그램 구성 파일을 업데이트하여 문제를 해결했습니다. 해당 연결에 대해 "연결 시간 초과 = 60"을 지정하십시오 (엔터티 프레임 워크 버전 5.0.0.0을 사용하고 있습니다).

연결 시간 초과 설정


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.