如何从Postgres中读取枚举数组到c#中的枚举列表?



. net core 6.0应用程序使用Npgsql v6.0.4.

表:


CREATE TABLE kontrolle.negativtext (
id serial NOT NULL,
check_doc "_negative_doc_check" NULL DEFAULT 
CONSTRAINT negativtext_pkey PRIMARY KEY (id)
);

check_doc是自定义enum类型_negative_doc_check的数组。

Enum:

select enum_range(null::negative_doc_check)

返回{CONTENT_HTML_DIRTY,CONTENT_HTML_CLEAN,CONTENT_TXT_DIRTY,CONTENT_TXT_CLEAN}

代码:

using System;
using System.Collections.Generic;
using Npgsql;
var constring = "SERVER=192.168.2.121;DATABASE=myuser;USER ID=mydb;PASSWORD=mypasswd;";
NpgsqlConnection.GlobalTypeMapper.MapEnum<negative_doc_check>("negative_doc_check");
await using var conn = new NpgsqlConnection(constring);
await conn.OpenAsync();
await using (var cmd = new NpgsqlCommand("SELECT check_doc from kontrolle.negativtext where id = 643", conn))
await using (var reader = await cmd.ExecuteReaderAsync()) {
while (await reader.ReadAsync()) {
var enumValue = reader.GetFieldValue<List<negative_doc_check>>(0);
Console.WriteLine(enumValue);
}
}
public enum negative_doc_check {
CONTENT_HTML_DIRTY = 0,
CONTENT_HTML_CLEAN = 1,
CONTENT_TXT_DIRTY = 2,
CONTENT_TXT_CLEAN = 4
}
public class Negativtext {
public int Id { get; set; }
public List<negative_doc_check> CheckDoc { get; set; }
}

异常:

System.InvalidCastException: "Received enum value 'CONTENT_TXT_DIRTY' from database which wasn't found on enum negative_doc_check"

枚举值在我的c#代码和Postgres类型定义中是相同的。我错过了什么,或者只是不可能读取枚举列表?

默认情况下,当将。net映射到PG枚举时,Npgsql假定。net枚举被命名为标准。net类型(Pascal Case,即NativeDocCheck而不是negative_doc_check),而PG枚举被假定为snake Case(即negative_doc_check)。建议修改你的。net enum以符合:

public enum NegativeDocCheck {
ContentHtmlDirty = 0,
ContentHtmlClean = 1,
ContentTxtDirty = 2,
ContentTxtClean = 4
}

否则,为了保持您的非标准命名,您可以告诉Npgsql在映射enum时按原样映射名称:

NpgsqlConnection.GlobalTypeMapper.MapEnum<negative_doc_check>("negative_doc_check", new NpgsqlNullNameTranslator());

相关内容

  • 没有找到相关文章

最新更新