Npgsql 3.0.0 ne parvient pas à analyser les types énumérés

c# dapper npgsql postgresql

Question

J'ai énuméré les types dans Postgres, définis comme suit:

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

J'ai le enum équivalent défini en C #:

public enum SomeEnumType {
    Val1,
    Val2
}

Lorsque j'ai mis à jour vers Npgsql v3.0.0, la désérialisation d'une classe avec une propriété de ce type échoue. Par exemple, j'ai:

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

Et dans le code:

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

Quand je vais désérialiser ma classe, je reçois l'erreur

Erreur d'analyse de la colonne 0 (Field1 = Le champ Field1 a un type actuellement inconnu de Npgsql (OID 6965926). Vous pouvez le récupérer sous forme de chaîne en le marquant comme inconnu, veuillez consulter la FAQ.)

J'ai essayé d'ajouter un gestionnaire de type à Dapper, mais cela n'a pas résolu l'exception. J'ai trouvé une question connexe et une réponse qui pointe vers une page FAQ sur le site Npgsql . Cependant, les seules réponses sur cette page semblent être:

1) Modifier la requête pour convertir explicitement les types inconnus en types intégrés
2) Changer toutes les requêtes Npgsql pour ne plus utiliser le codage binaire

La première solution complique considérablement mes requêtes, car les tables réelles comportent de nombreuses colonnes. Par exemple, l'utilisation de cette solution modifie toutes mes requêtes à partir de:

SELECT * FROM Foo

À:

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

Il s'agit clairement d'une solution inacceptable, car un nombre quelconque de modifications (réorganisation des colonnes, ajout de colonnes, suppression de colonnes, modification des types de colonnes, etc.) peuvent nécessiter la modification de la requête. La deuxième solution est plus facile à entretenir, mais nécessite davantage de données à envoyer au / depuis le serveur, ce qui aura un impact sur les performances. Existe-t-il un autre moyen (lire: plus facile à entretenir) pour obtenir Npgsql v3.0.0 pour analyser les types énumérés?

Réponse acceptée

La solution consiste à enregistrer chaque enum avant de créer des connexions. Dans mon cas, cette ligne a été ajoutée au constructeur statique de ma classe de couche d'accès aux données:

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

Si vous utilisez une dénomination insensible à la casse dans Postgres (par exemple, si vous ne spécifiez pas le type de données Postgres), vous n'avez pas besoin de transmettre de paramètres à RegisterEnumGlobally , car la valeur par défaut est le nom minuscule du type C #.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi