. 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());