sqlite et sqlserver avec dapper

dapper sql-server system.data.sqlite unit-testing

Question

J'utilise dapper avec SQL Server, mais j'utilise Sqlite pour certains tests en mémoire pour mes tests unitaires.

J'ai un cours comme suit

public class Test
{
  public int ID {get;set;}
  public string Name 
}

Si j'interroge en utilisant dapper avec une connexion SQL Server, cela fonctionne correctement.

Si j'interroge en utilisant dapper avec une connexion SQLite, j'obtiens une erreur de conversion de type. Fondamentalement, je dois changer le type d'ID pour qu'il soit long plutôt qu'int.

Je ne veux pas modifier mon schéma dans SQL Server, je me demande donc s'il existe une solution de contournement au scénario. J'ai essayé de créer et de créer une classe d'ID avec des distributions implicites sur long / int, mais cela échoue également et je n'ai plus d'idées!

Réponse populaire

Cela tourne autour du fait que Dapper utilise la méthode GetValue sur l'interface IDataRecord. La classe concrète dans l'espace de noms System.Data.SqlLite mappe probablement les valeurs différemment de celle de System.Data.SqlClient.

Comme @FelicePollano l'a fait remarquer, essayez de changer la structure de la table SQLLite et voyez si cela provoque la classe concrète dans System.Data.SqlLite à la mapper différemment.

Une autre option consiste à déployer votre propre mappage à l'aide de l'objet FastExpando que Dapper renvoie et le forcer à convertir la valeur en Int.

IEnumerable<dynamic> results = Conn.Query("Select ID from SomeTable");

var testValue = new Test
{
    ID = Convert.ToInt32(Results[0].ID.ToString())
};

Ce n'est pas vraiment un grand fan car cela pourrait nécessiter beaucoup de changements de code, mais cela peut fonctionner.

Remarque: cet exemple de code peut générer une exception si la colonne ID n'est pas un entier. Vous pouvez utiliser TryParse, mais par souci de concision, je ne l'ai pas inclus.




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