Npgsql 3.0.0 열거 형 형식을 구문 분석하는 데 실패한다

c# dapper npgsql postgresql

문제

Postgres에서 다음과 같이 정의 된 유형을 열거했습니다.

CREATE TYPE "SomeEnumType" AS ENUM (
    'Val1',
    'Val2'
);

나는 C #에서 정의 된 상응하는 열거 형을 가지고 :

public enum SomeEnumType {
    Val1,
    Val2
}

Npgsql v3.0.0으로 업데이트하면이 유형의 속성으로 클래스를 비 직렬화하지 못합니다. 예를 들어, 나는 가지고있다 :

CREATE TABLE Foo (
    Field1 "SomeEnumType" NOT NULL
);

그리고 코드에서 :

public class Foo {
    public SomeEnumType Field1 { get; set; }
}

수업을 비 직렬화 할 때 오류가 발생합니다.

Error parsing column 0 (Field1 = Field1 필드는 현재 Npgsql (OID 6965926)에 알려지지 않은 유형이며, 알 수 없음으로 표시하여 문자열로 검색 할 수 있습니다. FAQ를 참조하십시오.)

Dapper에 형식 처리기를 추가하려고 시도했지만 예외가 해결되지 않았습니다. Npgsql 사이트FAQ 페이지 를 가리키는 관련 질문과 대답 을 발견 했습니다 . 그러나 해당 페이지의 유일한 대답은 다음과 같습니다.

1) 알 수없는 유형을 내장 유형으로 명시 적으로 변환하도록 조회를 변경하십시오
2) 바이너리 인코딩을 사용하지 않도록 모든 Npgsql 쿼리를 변경하십시오.

첫 번째 해결 방법은 실제 테이블에 많은 열이 있으므로 쿼리를 복잡하게 만듭니다. 예를 들어이 솔루션을 사용하면 다음과 같은 모든 쿼리가 변경됩니다.

SELECT * FROM Foo

에:

SELECT Column1, Column2, Column3, Field1::TEXT, Column4 FROM Foo

여러 가지 변경 사항 (열 순서 변경, 열 추가, 열 삭제, 열 유형 변경 등)은 쿼리 변경이 필요할 수 있으므로 이는 분명히 받아 들일 수없는 솔루션입니다. 두 번째 솔루션은 유지 관리가 용이하지만 더 많은 데이터가 서버로 보내거나 서버에서 전송되어야하므로 성능에 영향을 미칩니다. 열거 형을 구문 분석하기 위해 Npgsql v3.0.0을 얻는 다른 방법이 있습니까?

수락 된 답변

해결 방법은 연결을 만들기 전에 각 열거 형을 등록하는 것입니다. 필자의 경우이 줄은 내 데이터 액세스 계층 클래스의 정적 생성자에 추가되었습니다.

NpgsqlConnection.RegisterEnumGlobally<SomeEnumType>(
    typeof(SomeEnumType).Name);

Postgres에서 대소 문자를 구별하지 않는 이름 지정 (예 : Postgres 데이터 유형을 인용하지 않음)을 사용하는 경우 기본값은 C # 유형의 소문자이므로 RegisterEnumGlobally 매개 변수를 전달할 필요가 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow