web-dev-qa-db-ja.com

Entity Framework Core移行タイムアウトを設定する方法は?

EF Coreの最新(1.0.0)バージョンを使用しています。かなり大きなデータベースで実行するための移行があります。

走る:

dotnet efデータベース更新-c ApplicationDbContext

そして取得:

タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。

接続文字列では、次のようにタイムアウトを明示的に設定します。

接続タイムアウト= 150000

残念ながら、助けにはなりませんでした。どうすればいいですか?

19
Andrzej Gis

表示されるエラーメッセージは、接続タイムアウトではなく、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);
    }
}
33
Mike Brind

Migrationsメソッドを呼び出す前にコンテキストでタイムアウトを設定することによってのみ、移行のタイムアウトを設定できます。

using (var context = new DispatchingDbContext(_configuration))
{
    context.Database.SetCommandTimeout(300);
    await context.Database.MigrateAsync().ConfigureAwait(false);
}

移行ef .netcoreのタイムアウトを設定

8
Peter

データベースコンテキストクラスのコンストラクターでも実行できます。

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
    Database.SetCommandTimeout(150000);
}
3

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サイトよりも高いアクセス許可を持ち、接続タイムアウトはより長くなります。この質問を参照してください- 移行に別の接続文字列(ただし同じデータベース)を使用する方法

2
Colin