无法更新数据库以进行EF核心迁移

时间:2018-09-21 19:41:21

标签: sql-server entity-framework asp.net-core

我向项目添加了一个很小的迁移。它只是将两列的数据类型更改为decimal(5,2)Add Migration命令生成迁移类。但是,Update-Database命令会引发异常。

此外,Remove-Migration引发相同的异常:

  

引发了一个异常,该异常可能是由于瞬时故障引起的。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。

我正在使用本地SQL Server 2014数据库。我用于开发目的的连接字符串非常简单:

"DbConnectionString": "Server=.;Database=DBNAME;Trusted_Connection=True;MultipleActiveResultSets=true"

该文件存储在config.json文件中。我正在使用最新版本的Visual Studio,即VS 2017 15.8.5。

我将Web项目更新为.NET Core 2.1,然后在Nuget中升级到了最新的稳定版2.1.4。这导致了错误消息的更改,该错误消息现在为:

  

引发了一个异常,该异常可能是由于瞬时故障引起的。考虑通过向EnableRetryOnFailure()调用中添加UseSqlServer来启用瞬态错误恢复能力。

我上了启动课程,尽管确实怀疑这是问题的根源,但确实添加了EnableRetryOnFailure属性。

services.AddDbContextPool<AppDbContext>(options => options.UseSqlServer(_configuration.GetConnectionString("DbConnectionString"), builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
        }));

生成的迁移类:

public partial class v50 : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<decimal>(
            name: "LnRrSncsm",
            table: "Jobs",
            type: "decimal(5, 2)",
            nullable: false,
            oldClrType: typeof(float));

        migrationBuilder.AlterColumn<decimal>(
            name: "LnRrQsnqcsm",
            table: "Jobs",
            type: "decimal(5, 2)",
            nullable: false,
            oldClrType: typeof(float));
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterColumn<float>(
            name: "LnRrSncsm",
            table: "Jobs",
            nullable: false,
            oldClrType: typeof(decimal),
            oldType: "decimal(5, 2)");

        migrationBuilder.AlterColumn<float>(
            name: "LnRrQsnqcsm",
            table: "Jobs",
            nullable: false,
            oldClrType: typeof(decimal),
            oldType: "decimal(5, 2)");
    }
}

1 个答案:

答案 0 :(得分:0)

好的,问题是硬编码到AppDbContextFactory中的连接字符串。解决方法是改用配置。

public AppDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<AppDbContext>();
        optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DbConnectionString"), opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds));

        return new AppDbContext(optionsBuilder.Options);
    }
相关问题