[C#] Entity Framework에서 데이터베이스 시간 초과 설정

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

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

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



답변

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

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>

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


답변

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

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


답변

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

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 분 이상) 내가 대신 글로벌 타임 아웃의 수정을해야합니다.


답변

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

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

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


답변

유창한 구현으로 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));
    }
}


답변

데이터베이스 우선 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;
}

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


답변

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

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