Нет, это не так.
Так устроен EF! Одной из причин может быть предотвращение бесконечных тупиков. Но, как ответили в номере 3, вы можете изменить время ожидания.
Вы можете установить контекст CommandTimeout в 0 в Entity Framework, чтобы он ожидал бесконечно долго. Чтобы установить это значение в разных версиях EF:
Entity Framework Core 2.0: Представлен IDesignTimeDbContextFactory:
public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
{
public SampleContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
optionsBuilder.UseSqlServer(
@"Server=.\;Database=db;Trusted_Connection=True;",
opts => opts.CommandTimeout(0)
);
return new SampleContext(optionsBuilder.Options);
}
}
И вы должен убедиться, что ваш контекст имеет конструктор, который принимает объект DbContextOptions в качестве параметра:
public SampleContext(DbContextOptions options) : base(options) { }
Entity Framework Core 1.0:
context.Database.SetCommandTimeout(0);
Entity Framework 6:
context.Database.CommandTimeout = 0;
Примечание Существующая возможность, предоставляемая EF
для изменения тайм-аута выполнения запроса, не означает, что это должно быть сделано во всех случаях. Тайм-аут выполнения запроса должен быть установлен так, чтобы успешное выполнение большинства запросов могло быть гарантировано, а также настолько низким, что запросы не будут выполняться и тратить или даже в некоторых случаях блокировать ресурсы бесконечно.
Есть несколько вещей, которые вы можете сделать перед увеличением времени ожидания, например:
Оптимизация запросов:
Усовершенствование программного и аппаратного обеспечения хост-машины
Изменение таблиц базы данных для правильной индексации
В конце концов, согласно этому ответ с использованием async/await
с EF
является очень плохая идея для оптимизации производительности .