无法将数据库类型字符转换为 Guid

Can't cast database type character to Guid

我将我的解决方案从 .Net 3.1 更新到 .Net 6。作为此升级的一部分,还将 Npgsql nuget 包从 5.0.10 更新到 6.0.4。

从那时起,当我尝试从数据库中检索数据时收到错误“无法将数据库类型字符转换为 Guid”。

我在上下文文件中的映射是

entity.Property(e => e.UserId).HasColumnName("user_id").HasColumnType("CHAR(36)");

在 C# class 中,这个 属性 是一个 GUID。

新版本的 npgsql 是否有一些映射更新?

EF Core 有一个 built-in 值转换器,可将 .NET Guid 属性隐式转换为文本列(see docs. Note that PostgreSQL has a full UUID type - 这是将 GUID 存储在数据库中的更好方法,而不是作为文本。

这适用于 EF Core 6.0.4 - 如果您遇到问题,请生成一个最小的、可运行的代码示例并将其添加到您上面的问题中。

工作 6.0 代码:

await using var ctx = new BlogContext();
await ctx.Database.EnsureDeletedAsync();
await ctx.Database.EnsureCreatedAsync();

ctx.Blogs.Add(new Blog { Guid = Guid.NewGuid()});
await ctx.SaveChangesAsync();

_ = await ctx.Blogs.ToListAsync();

public class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseNpgsql(@"Host=localhost;Username=test;Password=test")
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging();
}

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    [Column(TypeName = "CHAR(36)")]
    public Guid Guid { get; set; }
}