C#枚举到Postgres枚举 [英] C# enum to postgres enum
问题描述
我当前正在使用postgres枚举
I am currently using postgres enum
CREATE TYPE http_action_enum AS ENUM ('GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH');
CREATE TABLE IF NOT EXISTS response
(
id UUID PRIMARY KEY,
http_action http_action_enum NOT NULL
);
但是当我使用ef框架插入postgres数据库时,我一直遇到以下错误:
But when I using the ef framework to insert to postgres database I keep hit the below error:
Exception data:
Severity: ERROR
SqlState: 42804
MessageText: column "destination" is of type source_dest_enum but expression is of type integer
Hint: You will need to rewrite or cast the expression.
当我检查响应数据类型时,它实际上是正确的枚举,而不是整数.
When I check the response data type it is actually the correct enum and not integer.
Repository.cs
Repository.cs
public async Task<Response> InsertRecord(Response response, CancellationToken cancellationToken)
{
await dBContext.response.AddAsync(response, cancellationToken).ConfigureAwait(true);
await dBContext.SaveChangesAsync(cancellationToken).ConfigureAwait(true);
return response;
}
DBContext.cs
DBContext.cs
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
modelBuilder.HasPostgresEnum<SourceDestinationEnum>();
modelBuilder.HasPostgresEnum<HttpActionEnum>();
modelBuilder.Entity<Response>().Property(d => d.RespondedData).HasColumnType("json");
HttpActionEnum.cs
HttpActionEnum.cs
[JsonConverter(typeof(StringEnumConverter))]
public enum HttpActionEnum
{
GET,
POST,
}
有人遇到过将c#枚举映射到postgres枚举并且可以提出建议吗?
Does anyone come across mapping c# enum to postgres enum and could advice?
我尝试转换为枚举,但失败并报错,该列为enum类型,而表达式为text类型.
I tried converting to an enum but it's failing with an error that say the column is of type enum but expression is of type text.
https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions
DBContext.cs(已更新)
DBContext.cs (updated)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
modelBuilder.HasPostgresEnum<SourceDestinationEnum>();
modelBuilder.HasPostgresEnum<HttpActionEnum>();
modelBuilder.Entity<Response>(entity =>
{
entity.Property(e => e.RespondedData).HasColumnType("json");
entity.Property(e => e.Destination).HasConversion(
v => v.ToString(),
v => (SourceDestinationEnum)System.Enum.Parse(typeof(SourceDestinationEnum), v));
});
错误
+ InnerException {"42804: column \"destination\" is of type source_dest_enum but expression is of type text"} System.Exception {Npgsql.PostgresException}
推荐答案
Check the entity framework article about postgres enums here: https://www.npgsql.org/efcore/mapping/enum.html?tabs=tabid-1
即使创建了数据库枚举,Npgsql也必须知道它,尤其是应该映射到它的CLR枚举类型.通过在执行任何EF Core操作之前添加以下代码来完成此操作.合适的位置是在DbContext类的静态构造函数中:
Even if your database enum is created, Npgsql has to know about it, and especially about your CLR enum type that should be mapped to it. This is done by adding the following code, before any EF Core operations take place. An appropriate place for this is in the static constructor on your DbContext class:
static MyDbContext()
=> NpgsqlConnection.GlobalTypeMapper.MapEnum<Mood>();
对于非EF情况,请在此处查看信息: https://www.npgsql.org/doc/types/enums_and_composites.html
For non EF situations check information here: https://www.npgsql.org/doc/types/enums_and_composites.html
这篇关于C#枚举到Postgres枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!