【问题标题】:ALTER TYPE ... ADD cannot run inside a transaction block - Entity FrameworkALTER TYPE ... ADD 不能在事务块内运行 - 实体框架
【发布时间】:2021-10-21 23:59:36
【问题描述】:

我在添加枚举时尝试迁移到 PostGres 数据库时遇到错误。我正在使用 Dotnet5 和实体框架

ALTER TYPE 种族_enum ADD VALUE 'hi'; Npgsql.PostgresException (0x80004005): 25001: ALTER TYPE ... ADD 不能在事务块内运行

这是创建的迁移:

 protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterDatabase()
            .Annotation("Npgsql:Enum:patient_ethnicity_enum", "afna,hi")
            .OldAnnotation("Npgsql:Enum:patient_ethnicity_enum", "afna");

    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterDatabase()
            .Annotation("Npgsql:Enum:patient_ethnicity_enum",
                "afna")
            .OldAnnotation("Npgsql:Enum:patient_ethnicity_enum",
                "afna,hi");
    }

有什么办法解决这个问题吗?

【问题讨论】:

  • 在执行语句之前不要启动事务。
  • 如何避免这种情况?它是通过作为 ef 的一部分的数据库更新命令完成的?
  • 您使用的是 Postgres 版本 11 还是更低版本?
  • 我不假装懂EF,但是Suppress transaction怎么样?尽管没有提供实际代码,但我也看到了使用原始 SQL 进行枚举更改的建议。

标签: postgresql entity-framework-core ef-code-first


【解决方案1】:

根据 Adrian 的评论,我发现您可以这样做。

  migrationBuilder.Sql("ALTER TYPE patient_ethnicity_enum ADD VALUE 'hi'", true);
  migrationBuilder.AlterDatabase();

“true”参数用于抑制事务。

这可行,但并不理想,因为回滚迁移可能会导致实时数据出现大量问题。

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 2018-06-17
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2013-02-24
    • 2014-12-16
    相关资源
    最近更新 更多