Как установить тайм-аут миграции Entity Framework Core?
Я использую последнюю (1.0.0) версию EF Core. У меня есть переход для работы в довольно большой базе данных.
Я запускаю:
Обновление базы данных dotnet ef -c ApplicationDbContext
И получим:
Время ожидания истекло. Период ожидания, прошедший до завершения операция или сервер не отвечает.
В строке подключения я явно устанавливаю таймаут следующим образом:
Время ожидания подключения = 150000
К сожалению, это не помогло. Как мне это сделать?
Ответы
Ответ 1
Сообщение об ошибке, которое вы получаете, относится к тайм-ауту Command, а не к таймауту соединения. Невозможно установить CommandTimeout
в контексте при использовании команд EF. Но вы можете установить его глобально в конструкторе, а затем удалить позже, если вам не нужно его хранить:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
Database.SetCommandTimeout(150000);
}
}
Ответ 2
Используя Entity Framework 6, я устанавливаю более длительный тайм-аут для миграции с использованием свойства DbMigrationsConfiguration.CommandTimeout
.
Вот так:
В моем файле Global.asax.cs:
protected void Application_Start()
{
DatabaseMigrationConfig.Register();
//etc
}
Мой DatabaseMigrationConfig
Класс:
public class DatabaseMigrationConfig
{
internal static void Register()
{
using (var context = new MyContext(Config.ConnectionStringMigrations))
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext,
Migrations.Configuration>());
context.Database.Initialize(false);
}
}
}
Мой Migrations.Configuration
класс:
using System.Data.Entity.Migrations;
internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
CommandTimeout = 360;// <----- 6 minute timeout!
}
}
Литература:
Миграции: ошибка таймаута в командах Update-Database
DbMigrationsConfiguration.CommandTimeout Свойство
Обратите внимание, что во время миграции я также использую другую строку соединения - у пользователя более высокие разрешения, чем у веб-сайта, и время ожидания соединения больше. См. Этот вопрос - Как использовать другую строку соединения (но такую же базу данных) для переноса
Ответ 3
Вы можете установить тайм-аут для переноса только путем установки таймаута в контексте перед вызовом метода Migrations:
using (var context = new DispatchingDbContext(_configuration))
{
context.Database.SetCommandTimeout(300);
await context.Database.MigrateAsync().ConfigureAwait(false);
}
Установить тайм-аут для миграции ef.netcore