无法将数据库类型字符转换为 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; }
}
我将我的解决方案从 .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; }
}