Dapper no ocupa campos y arroja excepciones

asp.net-mvc-3 dapper

Pregunta

Estoy cambiando de ActiveRecord a Dapper. Tengo una clase de proyecto simple con un par de campos:

  • Yo dint)
  • Nombre (cadena)
  • Secreto (guid)
  • OwnerId (guid)

Mi intento inicial de usar Dapper dio como resultado este código: estoy usando Dapper así:

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects p WHERE p.OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

Esta consulta dio como resultado una DataException: Error parsing column 0 (Id=11 - Int16) . La excepción interna es una InvalidCastException: Specified cast is not valid.

Como ninguna de las muestras en la página de uso de Dapper menciona SELECT * , intenté reformar mi consulta de la siguiente manera:

    projects = conn.Query<Project>("SELECT OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();

Cuando depuro, aunque tengo dos proyectos en mi base de datos, solo recibo uno; y ese tiene nulo por un nombre.

Extraño. ¿Qué estoy haciendo mal? Siento que Dapper no está mapeando correctamente los campos (DB) en los campos (clase). Estoy usando la última versión de NuGet.

Respuesta aceptada

La diferencia que está viendo es la característica clave en la próxima versión (1.12?). Históricamente, Dapper ha sido muy quisquilloso con los datos que deben ser una coincidencia total, y se quejaría (arrojaría) si, por ejemplo, los datos son dobles pero el campo / propiedad es flotante, o los datos son largos y el campo / propiedad es int. . En la versión pendiente hay un código adicional para detectar esto y compensarlo como parte del IL generado (no a través de Convert.ChangeType - demasiado lento).

Un factor clave para este cambio es que algunas bases de datos devuelven valores bastante simples de maneras muy diferentes. A menudo, era problemático para los usuarios de algunas bases de datos mapear sus tipos.

Tl; dr: me alegro de que la nueva característica funcione para usted. Debería ser lanzado pronto.


Respuesta popular

Dapper solo asignará el resultado del SQL, por lo que deberá seleccionar de la tabla que desea asignar.

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects Where OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

Si



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