2014-01-16 3 views
4

대량의 채워진 탐색 속성을 끌어온 쿼리를 사용하고있었습니다. 본질적으로이 속 : MySql.Data.MySqlClient :IO 작업의 시간 초과

using(var context = new MyApplicationContext()) 
{ 
    DbSet<BaseTable> dbSet = context.Set<BaseTable>(); 
    IQueryable<BaseTable> query = dbSet; 

    query = query.Include(entity => entity.T.C); 
    query = query.Include(entity => entity.TC.Select(tc => tc.T.M)); 
    query = query.Include(entity => entity.TC); 
    query = query.Include(entity => entity.W.FW.F.S); 
    query = query.Include(entity => entity.W.FW.P); 
    query = query.Include(entity => entity.W.PL.P); 
    query = query.Include(entity => entity.W.PL); 
    query = query.Include(entity => entity.W.E); 
    query = query.Include(entity => entity.E); 

    query = query.Where(set of conditions); 

    List<BaseTable> Loaded = query.ToList(); 
} 

그러나,이 코드를 실행하는 IO 동작에서 오류

초과
[IO 동작에서 초과 TimeoutException]을 생성. TimedStream.StopTimer() +168
MySql.Data.MySqlClient.TimedStream.Read (Byte [] 버퍼, Int32 오프셋, Int32 개수) +148
System.IO.BufferedStream.Read (Byte [] array, Int 32 오프셋, Int32 개수) +262
MySql.Data.MySqlClient.MySqlStream.ReadFully (스트림 스트림, Byte 버퍼, Int32 오프셋, Int32 개수) +86
MySql.Data.MySqlClient.MySqlStream.LoadPacket() + 110
MySql.Data.MySqlClient.MySqlStream.ReadPacket() +59
MySql.Data.MySqlClient.NativeDriver.GetResult (INT32 & affectedRow, INT64 & insertedId) +100
MySql.Data.MySqlClient.Driver.GetResult (Int32 statementId, Int32 & affectedRows, Int64 & insertedId) +54
MySql.Data.MySqlClient.Driver.NextResult (Int32 statementId, Boolean 힘) 145
MySql.Data.MySqlClient.MySqlDataReader.NextResult() 1939

(CommandBehavior를 동작은) 어떻게이 쿼리하도록 허용 할 수 있습니다 524
MySql.Data.MySqlClient.MySqlCommand.ExecuteReader 적재하기에 충분한 시간입니까?

답변

9

명령 시간 초과 속성을 늘리면됩니다.

엔티티 프레임 워크에서 사용되는 컨텍스트는 DbContext에서 상속됩니다. 이것은 IObjectContextAdapter이지만 ObjectContext 메서드에 쉽게 액세스 할 수는 없습니다. 따라서 명령 시간 초과 등록 정보에 액세스하려면 Database 속성 DbContext을 통과해야합니다.

query = query.Include(entity => entity.T.C); 
    query = query.Include(entity => entity.TC.Select(tc => tc.T.M)); 
    query = query.Include(entity => entity.TC); 
    query = query.Include(entity => entity.W.FW.F.S); 
    query = query.Include(entity => entity.W.FW.P); 
    query = query.Include(entity => entity.W.PL.P); 
    query = query.Include(entity => entity.W.PL); 
    query = query.Include(entity => entity.W.E); 
    query = query.Include(entity => entity.E); 

    query = query.Where(set of conditions); 

    List<BaseTable> Loaded = query.ToList(); 
} 

//set an increased command timeout by accessing Database property 
    //on the context 
    context.Database.CommandTimeout = 300;//in seconds (5 minutes) 

using(var context = new MyApplicationContext()) 
{ 
    DbSet<BaseTable> dbSet = context.Set<BaseTable>(); 
    IQueryable<BaseTable> query = dbSet; 
지금 조회가 필요한 경우 더 많은 양의 데이터를 끌어 오기 위해 필요한 시간을 가질 수 있습니다.

+0

당신이 연결 문자열의 기본 명령 제한 시간을 지정하는 데 충분한 있는지 알 수 있습니까? 또는 위에 표시된대로 지정해야합니까? – chriszumberge

+1

@chriszumberge - 이것은 코드에서 변수 설정을 보여주는 것입니다. 또한 연결 문자열에 설정할 수도 있지만,이 긴 시간 제한을 항상 설정하지 않는 것이 좋습니다. –

2

사용

의 web.config

에 연결 문자열이 코드 " default command timeout=0"

"server=localhost;Database=Database;uid=;pwd=;Allow User Variables=True;Convert Zero Datetime=True;default command timeout=0" 
관련 문제