Тайм-ауты структуры организации

Я получаю таймауты с использованием Entity Framework (EF) при использовании импорта функции, для завершения которой требуется более 30 секунд. Я попробовал следующее и не смог решить эту проблему:

Я добавил Default Command Timeout=300000 в строку подключения в файле App.Config в проекте с файлом EDMX, как это предлагается здесь .

Вот как выглядит моя строка подключения:

  

Я попытался настроить CommandTimeout в моем репозитории прямо так:

 private TrekEntities context = new TrekEntities(); public IEnumerable GetKirksFriends() { this.context.CommandTimeout = 180; return this.context.GetKirksFriends(); } 

Что еще я могу сделать, чтобы получить EF от тайм-аута? Это происходит только для очень больших наборов данных. Все работает отлично с небольшими наборами данных.

Вот одна из ошибок, которые я получаю:

System.Data.EntityCommandExecutionException: Произошла ошибка при выполнении определения команды. Подробнее см. Внутреннее исключение. —> System.Data.SqlClient.SqlException: время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает.


ОК – я получил эту работу, и это глупо, что произошло. У меня была строка подключения с Default Command Timeout=300000 а CommandTimeout – 180. Когда я удалил Default Command Timeout из строки подключения, он работал. Таким образом, ответ заключается в том, чтобы вручную установить CommandTimeout в вашем репозитории на свой контекстный объект следующим образом:

 this.context.CommandTimeout = 180; 

Очевидно, что установка параметров таймаута в строке подключения не влияет на него.

Известна ошибка с указанием тайм-аута команды по умолчанию в строке подключения EF.

http://bugs.mysql.com/bug.php?id=56806

Удалите значение из строки подключения и установите его на самом объекте контекста данных. Это будет работать, если вы удалите конфликтующее значение из строки подключения.

Entity Framework Core 1.0:

 this.context.Database.SetCommandTimeout(180); 

Entity Framework 6:

 this.context.Database.CommandTimeout = 180; 

Entity Framework 5:

 ((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180; 

Entity Framework 4 и ниже:

 this.context.CommandTimeout = 180; 

Если вы используете DbContext, используйте следующий конструктор для установки таймаута команды:

 public class MyContext : DbContext { public MyContext () { var adapter = (IObjectContextAdapter)this; var objectContext = adapter.ObjectContext; objectContext.CommandTimeout = 1 * 60; // value in seconds } } 

Если вы используете DbContext и EF v6 +, вы также можете использовать:

 this.context.Database.CommandTimeout = 180; 

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

 int? prevto = uow.Context.Database.CommandTimeout; uow.Context.Database.CommandTimeout = 900; using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) { ... } 

В конце функции я вернул тайм-аут команды в предыдущее значение в предыдущем.

Использование EF6

Я знаю, что это очень старый stream, но EF не исправил это. Для людей, использующих автогенерированный DbContext можно использовать следующий код для установки таймаута вручную.

 public partial class SampleContext : DbContext { public SampleContext() : base("name=SampleContext") { this.SetCommandTimeOut(180); } public void SetCommandTimeOut(int Timeout) { var objectContext = (this as IObjectContextAdapter).ObjectContext; objectContext.CommandTimeout = Timeout; } 

Это то, что я финансирую. Может быть, это кому-то поможет:

Итак, вот мы идем:

Если вы используете LINQ с EF, ищите некоторые точные элементы, содержащиеся в списке, например:

 await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync(); 

все идет хорошо, пока IdList не содержит более одного идентификатора.

Проблема «тайм-аута» возникает, если в списке содержится только один идентификатор. Чтобы решить проблему, используйте условие проверки количества идентификаторов в IdList.

Пример:

 if (IdList.Count == 1) { result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync(); } else { result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync(); } 

Объяснение:

Просто попробуйте использовать Sql Profiler и проверьте оператор Select, сгенерированный Entity frameeork. …

Если вы используете Entity Framework, например я, вы должны определить Time out on Startup следующим образом:

  services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180))); 
  • Использование Entity Framework с частной компактной установкой SQL Compact
  • EF 4.3 Автоматическая миграция с несколькими DbContexts в одной базе данных
  • Использование свойств DateTime в Code-First Entity Framework и SQL Server
  • Entity Framework Code First Fluent Api: добавление индексов в столбцы
  • Объект нельзя удалить, поскольку он не найден в ObjectStateManager
  • Как реализовать Единицу работы, которая работает с EF и NHibernate
  • Преобразование String в Int в EF 4.0
  • Обновление отношений при сохранении изменений объектов EF4 POCO
  • Добавление сложных типов хранимых процедур в Entity Framework
  • Возможно ли по умолчанию использовать поле DateTime для GETDATE () с миграциями Entity Framework?
  • Как преобразовать DbSet в инфраструктуру Entity в ObjectQuery
  • Давайте будем гением компьютера.