如何設置Entity Framework Core遷移超時?

c# entity-framework entity-framework-core

我正在使用最新的(1.0.0)版本的EF Core。我有一個遷移到一個相當大的數據庫上運行。

我跑:

dotnet ef數據庫更新-c ApplicationDbContext

得到:

超時已過期。操作完成之前經過的超時時間或服務器沒有響應。

在連接字符串中,我明確設置了超時,如下所示:

連接超時= 150000

不幸的是,它沒有幫助。我該怎麼做?

一般承認的答案

您獲得的錯誤消息是命令超時,而不是連接超時。

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);
}

設置遷移超時ef .netcore



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow