2017-07-27 3 views
0

Je viens de passer de Npgsql v2.2.3 à v3.2.4.1 (maintenant V3.2.5) sur un système utilisant Dapper et SimpleCRUD - autres développeurs absents version personnalisée de ce dernier. Son pas vraiment mon domaine - Je voulais juste faire quelques bits de PostGIS avec le soutien v3 ...Dapper.SqlMapper.AddTypeHandler ne semble pas être appelé avec Postgres SimpleCRUD où la clause

Nous avons une version personnalisée de DateTime qui, sous Npgsql v3.x frappe plus stricte, nous oblige à mettre le NpgsqlDbType à NpgsqlTypes.NpgsqlDbType.Timestamp. Ceci est fait via un Dapper.SqlMapper.AddTypeHandler dans le code SimpleCRUD. La version personnalisée force le type d'heure de la date à être UTC. Bien que cela fonctionne comme prévu pour les insertions de base de données, il ne semble pas être appelé lorsqu'une clause WHERE est utilisée - pas sûr si c'est juste dans des cas isolés, ou juste dans un ou deux endroits.

Je peux voir à partir des journaux Postgres que les paramètres de la clause WHERE sont ajustées pour UTC/conversion locale: paramètres: $ 1 = '27/07/2017 13: 29: 51 + 01'

via des points d'arrêt, je peux aussi voir que le gestionnaire de type n'est pas entré pour la clause WHERE, mais pour INSERT etc.

QUESTIONS:

Dois-je attendrons le gestionnaire de type Dapper.SqlMapper à appeler pour WHERE paramètres de la clause?

Si ce comportement n'est pas attendu, comment forcer NpgsqlDbType à NpgsqlTypes.NpgsqlDbType.Timestamp lors de l'utilisation de Dapper.SimpleCRUD?

Un grand merci

J'ai mis à jour dernier paquet de NuGet Npgsql (3.2.5) et Dapper (1.50.2). Je ne suis pas sûr de l'origine de Dapper.SimpleCRUD mais il aurait commencé sa vie en 2014 avant d'être ce qui semble avoir été potentiellement fortement personnalisé, préférant continuer plutôt que de mettre à jour et d'ajouter les personnalisations.

Répondre

0

Géré le problème.

J'ai ajouté un gestionnaire SqlMapper.ICustomQueryParameter (DateTimeUTCParameter) et l'ai appelé depuis SimpleCRUD dans le cadre de ConstructDynamicParameters au lieu de faire directement la conversion.

En fin de compte, ce fut un changement avant droit, une fois que je l'avais identifié ce qui était nécessaire.

private static DynamicParameters ConstructDynamicParameters(Dictionary<string, object> conditionParameters) 
    { 
     var dynParms = new DynamicParameters(); 
     foreach (var kvp in conditionParameters) 
     { 
      if (kvp.Value is DateTimeUTC) 
       dynParms.Add(string.Format("@{0}", kvp.Key), new DateTimeUTCParameter((DateTimeUTC)kvp.Value)); 
      else 
       dynParms.Add(string.Format("@{0}", kvp.Key), kvp.Value); 
     } 
     return dynParms; 
    }