Dapper.FastCRUD를 사용하여 C # enum을 PostgreSQL enum으로 매핑하는 방법은 무엇입니까?

c# dapper dapper-fastcrud enums postgresql

문제

클래스 Sample , 그 중 하나는 enum 인 TargetType 입니다. 관련 테이블 samples 이 PostgreSQL 데이터베이스에 정의되어 있으며 일치하는 enum 유형 인 targettypes 있습니다.

Dapper.FastCRUD를 사용하면 테이블에서 레코드를 성공적으로 검색 할 수 있습니다. 그러나 삽입하는 동안 오류가 발생합니다.

Npgsql.PostgresException (0x80004005): 42804: column "target_type" is of type targettype but expression is of type integer

편집 1 : MoonStorm - Dapper의 창시자 .FastCRUD - Dapper가 DB-CLR 유형 변환을 처리한다고 설명했습니다. 이제 문제는 다음과 같습니다.

Dapper에게 C # enum TargetType 을 PostgreSQL ENUM TYPE targettype 어떻게 ENUM TYPE targettype 합니까?

열거 형은 다음과 같이 정의됩니다.

public enum TargetType
{
    [NpgsqlTypes.PgName("Unknown")]
    UNKNOWN = 0,

    [NpgsqlTypes.PgName("Animal")]
    ANIMAL = 1,

    [NpgsqlTypes.PgName("Car")]
    CAR = 2,

    [NpgsqlTypes.PgName("Truck")]
    TRUCK = 3
}

클래스는 다음과 같이 정의됩니다.

[Table("samples")]
public partial class Sample
{
    [Column("recording_time")]
    public DateTime RecordingTime { get; set; }

    [Column("x_position")]
    public double X_Position { get; set; }

    [Column("x_velocity")]
    public double X_Velocity { get; set; }

    [Column("y_position")]
    public double Y_Position { get; set; }

    [Column("y_velocity")]
    public double Y_Velocity { get; set; }

    [Key]
    [Column("id")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public ulong Id { get; set; }

    [Column("target_type")] // <--- This is the offending column
    public TargetType TargetType { get; set; }

}

편집 2 : 삽입 인서트로 예제를 수정했습니다.

사용법 그림 :

using Npgsql;
using Dapper.FastCrud;
...

NpgsqlConnection.MapEnumGlobally<TargetType>("public.targettype"); // ... (1)

OrmConfiguration.DefaultDialect = SqlDialect.PostgreSql;

(using NpgsqlConnection conn = ...) // Connect to database
{
    var samples = conn.Find<Sample>();  // <--- This works correctly
    foreach (Sample s in samples)
        Console.WriteLine(s);

    ... // Generate new samples

    using (var writer = conn.BeginBinaryImport(sql))
    {
        foreach (Sample s in entities)
        {
            writer.StartRow();

            writer.Write(s.TargetType);  // <--- This insert works, due to (1)
            ...
        }
    }

    foreach (Sample sample in sampleList)
        conn.Insert<Sample>(sample);    // <--- This throws PostgresException
    ...
}

인기 답변

아마도 TargetType을 정수로 변환해야 할 것입니다.

테스트되지 않았지만 다음과 같은 것 :

Get 
{
    return (int)this.TargetType;
}


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