EF Coreの最新(1.0.0)バージョンを使用しています。かなり大きなデータベースで実行するための移行があります。
走る:
dotnet efデータベース更新-c ApplicationDbContext
そして取得:
タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
接続文字列では、次のようにタイムアウトを明示的に設定します。
接続タイムアウト= 150000
残念ながら、助けにはなりませんでした。どうすればいいですか?
表示されるエラーメッセージは、接続タイムアウトではなく、Commandタイムアウトに関するものです。
[〜#〜] update [〜#〜]
コメントで Pace で述べたように、EF Core 2.0ではIDesignTimeDbContextFactory
を使用して、次のような設計時のツールによって作成されたコンテキストの動作を変更できます。移行。
IDesignTimeDbContextFactory
インターフェイスを実装する別のクラスをプロジェクトに作成し、DbContextoptionsBuilder
を使用して必要な動作を設定します。この場合、コマンドタイムアウト値を600秒に設定します。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace EFCoreSample.Model
{
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((int)TimeSpan.FromMinutes(10).TotalSeconds));
return new SampleContext(optionsBuilder.Options);
}
}
}
既存のDbContext
に、DbContextOptions
オブジェクトをパラメーターとして取るコンストラクターがあることを確認してください。
public AdventureContext(DbContextOptions options) : base(options){}
ツールが移行を実行すると、最初にIDesignTimeDbContextFactory
を実装するクラスを探し、見つかった場合はそれを使用してコンテキストを構成します。ランタイムの動作は影響を受けません。
元の回答は適用されなくなりました
EFコマンドを使用する場合、コンテキストにCommandTimeout
を設定する方法はありません。ただし、コンストラクタでグローバルに設定し、保持する必要がない場合は後で削除できます。
public class ApplicationDbContext : DbContext { public ApplicationDbContext() { Database.SetCommandTimeout(150000); } }
Migrationsメソッドを呼び出す前にコンテキストでタイムアウトを設定することによってのみ、移行のタイムアウトを設定できます。
using (var context = new DispatchingDbContext(_configuration))
{
context.Database.SetCommandTimeout(300);
await context.Database.MigrateAsync().ConfigureAwait(false);
}
データベースコンテキストクラスのコンストラクターでも実行できます。
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
Database.SetCommandTimeout(150000);
}
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プロパティ
また、移行時に別の接続文字列を使用することに注意してください。ユーザーはWebサイトよりも高いアクセス許可を持ち、接続タイムアウトはより長くなります。この質問を参照してください- 移行に別の接続文字列(ただし同じデータベース)を使用する方法