C# 如何设置实体框架核心迁移超时?
我使用的是EF Core的最新(1.0.0)版本。我要在一个相当大的数据库上运行迁移 我运行: dotnet ef数据库更新-c ApplicationDbContext 并获得: 超时已过期。完成之前的超时时间 操作或服务器没有响应 在连接字符串中,我显式设置超时,如下所示: 连接超时=150000C# 如何设置实体框架核心迁移超时?,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我使用的是EF Core的最新(1.0.0)版本。我要在一个相当大的数据库上运行迁移 我运行: dotnet ef数据库更新-c ApplicationDbContext 并获得: 超时已过期。完成之前的超时时间 操作或服务器没有响应 在连接字符串中,我显式设置超时,如下所示: 连接超时=150000 不幸的是,这没有帮助。我应该如何执行此操作?您收到的错误消息是命令超时,而不是连接超时 更新 正如在评论中提到的,由于EF Core 2.0,您可以使用IDesignTimeDbContextFa
不幸的是,这没有帮助。我应该如何执行此操作?您收到的错误消息是命令超时,而不是连接超时 更新 正如在评论中提到的,由于EF Core 2.0,您可以使用
IDesignTimeDbContextFactory
在设计时通过工具创建上下文时更改上下文的行为,例如迁移
在项目中创建一个单独的类,该类实现IDesignTimeDbContextFactory
接口,并使用DBContextOptions Builder
配置所需的行为-在这种情况下,将命令超时值设置为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);
}
}
}
当工具运行迁移时,它首先查找实现IDesignTimeDbContextFactory
的类,如果找到,将使用该类配置上下文。运行时行为不受影响
原始答案不再适用
使用EF命令时,无法在上下文上设置命令超时。但您可以在构造函数中全局设置它,如果不需要保留它,则可以稍后将其删除:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
Database.SetCommandTimeout(150000);
}
}
使用EntityFramework6(而不是CORE!),我使用DbMigrationsConfiguration.CommandTimeout
属性为迁移设置了更长的超时时间
像这样:
在my Global.asax.cs中:
protected void Application_Start()
{
DatabaseMigrationConfig.Register();
//etc
}
MyDatabaseMigrationConfig
Class:
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);
}
}
}
参考资料:
请注意,我在迁移期间也使用了不同的连接字符串-用户的权限高于网站,并且连接超时更长。请参阅此问题-在调用迁移方法之前,您只能通过在上下文中设置超时来设置迁移超时:
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);
}
public ApplicationDbContext(DbContextOptions)
:基本(选项)
{
数据库.SetCommandTimeout(150000);
}
您确定,您的答案对Entity Framework CORE有效吗?我不确定,因为我没有使用它,但我认为很容易检查我是否已下载并正在使用它。您是说已从Core中删除了dbmigtorinsconfiguration.CommandTimeout
?EF Core中没有dbmigtorinsconfiguration。它已被删除。答案很好,但请指定它是针对“Entity Framework 6(非核心)”的,因为人们会感到困惑:)请注意,这些是秒,因此此处设置的超时约为两天。作为一种解决方法,我是否可以使用任何条件来增加仅用于迁移的超时?像if(IsMigrations()){Database.SetCommandTimeout(1500)}
分配超时值一样,我更喜欢使用TimeSpan
,目的很清楚:(int)TimeSpan.frommins(20).TotalSeconds
@Simon\u Weaver正如他在评论中提到的那样,现在有了一个解决方案。我已经更新了答案以提供一个示例。不过,插入连接字符串会很好。这是可行的,但它适用于所有情况,而不仅仅是迁移。似乎应该有一种方法将其仅应用于迁移。谢谢,这很有帮助,只是您将其设置为属性而不是函数:Database.CommandTimeout=150000;
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);
}