EF Core - 在 PostgreSQL 13 中将列类型从 varchar 更改为 uuid:列无法自动转换为类型 uuid

EF Core - Change column type from varchar to uuid in PostgreSQL 13: column cannot be cast automatically to type uuid

之前:

public class MyEntity
{
    public string Id { get; set; }
    //...
}

配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //...

    modelBuilder.Entity<MyEntity>()
        .Property(e => e.Id)
        .ValueGeneratedOnAdd();
}

这是之前开发人员的代码,它生成了该列的 GUID 值。但在 C# 中我必须处理字符串,所以我决定更改模型。

之后:

public class MyEntity
{
    public Guid Id { get; set; }
    //...
}

并且我从 Fluent API 配置中删除了 ValueGeneratedOnAdd() 代码。

我收到 column "Id" cannot be cast automatically to type uuid 错误。

我认为这条消息的关键是 automatically 字。

现在我的问题是,由于该列上的值已经是 GUID/UUID,是否有任何方法可以告诉 Postgres 将 varchar 类型更改为 uuid 并转换当前的将字符串值转换为 UUID 并将其放入列中?我猜应该有一个 SQL 脚本可以做到这一点而不会丢失任何数据。

使用USING _columnname::uuid。这是一个例子。

-- Prepare a test case:
create table delme (x varchar);
insert into delme (x) values 
 ('b575ec3a-2776-11eb-adc1-0242ac120002'),
 ('4d5c5440-2776-11eb-adc1-0242ac120002'),
 ('b575f25c-2776-11eb-adc1-0242ac120002');

-- Here is the conversion that you need:
ALTER TABLE delme ALTER COLUMN x TYPE uuid USING x::uuid;

在您的具体情况下:

ALTER TABLE "MyEntity" ALTER COLUMN "Id" TYPE uuid USING "Id"::uuid;

顺便说一句,您的应用程序是数据库模型的唯一所有者吗?如果不是,那么更改现有的 table 是个坏主意。