IO操作超时

Tra*_*s J 5 c# mysql entity-framework

我正在使用一个查询,该查询撤回了大量填充的导​​航属性.基本上它看起来像这样:

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();
}
Run Code Online (Sandbox Code Playgroud)

但是,运行此代码会产生错误

IO操作超时
[TimeoutException:IO操作超时] MySql.Data.MySqlClient.TimedStream.StopTimer()+ 168
MySql.Data.MySqlClient.TimedStream.Read(Byte []缓冲区,Int32偏移量,Int32计数)+148
系统. IO.BufferedStream.Read(Byte []数组,Int32偏移量,Int32计数)+262
MySql.Data.MySqlClient.MySqlStream.ReadFully(流stream,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 force
)+145
MySql.Data.MySqlClient.MySqlDataReader.NextResult ()+ 524 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader (CommandBehavior行为)+1939

如何允许此查询有足够的时间加载?

Tra*_*s J 11

您需要做的是增加命令超时属性.

在实体框架中,使用的上下文继承自DbContext.这是一个IObjectContextAdapter但不包含对ObjectContext方法的轻松访问.因此,为了访问命令超时属性,您需要通过该Database属性DbContext.

using( var context = new MyApplicationContext() )
{
    DbSet<BaseTable> dbSet = context.Set<BaseTable>();
    IQueryable<BaseTable> query = dbSet;
Run Code Online (Sandbox Code Playgroud)
   //set an increased command timeout by accessing Database property
   //on the context
   context.Database.CommandTimeout = 300;//in seconds (5 minutes)
Run Code Online (Sandbox Code Playgroud)
    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();
}
Run Code Online (Sandbox Code Playgroud)

现在,您的查询可以拥有所需的时间,以便在必要时提取更多数据.