Cómo mapear C # enum a PostgreSQL enum usando Dapper.FastCRUD?

c# dapper dapper-fastcrud enums postgresql

Pregunta

Tengo una Sample clase, una de cuyas propiedades es una enumeración, TargetType . Tengo una tabla correspondiente samples definidos en una base de datos PostgreSQL, junto con un tipo de enumeración correspondiente, tipo de targettypes .

Con Dapper.FastCRUD, puedo recuperar registros de la tabla con éxito. Sin embargo, recibo un error durante la inserción:

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

EDIT 1: MoonStorm - creador de Dapper.FastCRUD - aclaró que las conversiones tipo DB-CLR son manejadas por Dapper. Entonces, ahora la pregunta es:

¿Cómo le digo a Dapper que enum TargetType objetivo de ENUM TYPE targettype C # enum TargetType de tipo ENUM TYPE targettype PostgreSQL?

La enumeración se define como:

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

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

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

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

Y la clase se define como:

[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; }

}

EDIT 2 : revisó el ejemplo con inserción de trabajo.

Ilustración del uso:

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
    ...
}

Respuesta popular

Probablemente tengas que convertir TargetType en un entero.

No probado pero algo así como:

Get 
{
    return (int)this.TargetType;
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué