sqlite y sqlserver con dapper

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

Pregunta

Estoy usando dapper con SQL Server, pero usando Sqlite para algunas pruebas de memoria para mis pruebas unitarias.

Tengo una clase de la siguiente manera

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

Si consulto usando dapper con una conexión de SQL Server, funciona bien.

Si consulto el uso de dapper con una conexión SQLite, aparece un error de tipo de conversión. Básicamente, necesito cambiar el tipo de ID para que sea largo, en lugar de int.

No quiero cambiar mi esquema en SQL Server, así que me pregunto si hay una solución al escenario. He intentado crear y clase de ID con conversiones implícitas en long / int, pero esto también falla, ¡y me he quedado sin ideas!

Respuesta popular

Esto gira en torno al hecho de que Dapper utiliza el método GetValue en la interfaz IDataRecord. La clase concreta en el espacio de nombres System.Data.SqlLite probablemente asigna valores de forma diferente a la de System.Data.SqlClient.

Como señaló @FelicePollano, intente cambiar la estructura de la tabla SQLLite y vea si eso hace que la clase concreta en System.Data.SqlLite lo correlacione de manera diferente.

Otra opción es desplegar su propia asignación utilizando el objeto FastExpando que devuelve Dapper y forzarlo a convertir el valor a un valor Int.

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

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

No es muy fanático porque podría requerir muchos cambios de código, pero puede funcionar.

Tenga en cuenta: ese código de ejemplo puede arrojar una excepción si la columna ID no es un número entero. Puedes usar TryParse, pero en aras de la brevedad no lo incluí.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow