2016-08-09 2 views
0

Я хочу, чтобы все обычные команды имели тайм-аут по умолчанию 30 секунд, но для одного хранимого процесса мне нужно 5 мин.Как указать время ожидания для каждой команды в Entity Framework?

Я не хочу делать это, если это не единственный способ.

public partial class AContext : DbContext 
{ 
    public AContext(string connectionString) 
     : base(connectionString) 
    { 
     ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300; 
    } 
} 

Как подключить таймаут только по этому запросу?

Context.Database.SqlQuery<AAAAA>("usp_AAAAA"); 
+0

измените его перед выполнением хранимой процедуры и верните его после выполнения :) – techspider

ответ

1

Вы можете установить CommandTimeout на Database свойстве DbContext непосредственно, нет необходимости, чтобы попытаться получить контекст объекта из DbContext.

Создайте новый экземпляр DbContext только для вашего исполнения, а затем избавитесь от него.

Если у вас есть общий экземпляр DbContext, вам придется завернуть вызов в блок try/finally и сбросить таймаут в конце, это значит, что таймаут будет сброшен даже в случае сбоя.

using(var Context = new AContext()) 
{ 
    Context.Database.CommandTimeout = 60*5; // 5 minutes 
    var result = Context.Database.SqlQuery<AAAAA>("usp_AAAAA"); 
} 

Если общий контекст.

try 
{ 
    Context.Database.CommandTimeout = 60*5; // 5 minutes 
    var result = Context.Database.SqlQuery<AAAAA>("usp_AAAAA"); 
} 
finally{ 
    Context.Database.CommandTimeout = null; // reset 
}