Dapper no leerá las propiedades del objeto a menos que se indique explícitamente como tipo anónimo

c# dapper

Pregunta

Dapper Query no está rellenando los parámetros de las propiedades de los objetos tipeados por algún motivo.

El siguiente código arroja una excepción diciendo que debo declarar @Username, aunque las credenciales contienen credentials.Username propiedad. Nombre de usuario:

const string qryCheckCredentials = "SELECT 1 AS Authenticated FROM dbo.KIUser WHERE Username=@Username AND Password=@PasswordMD5";
if (!sqlConn.Query<Boolean>(qryCheckCredentials, param: credentials).FirstOrDefault<Boolean>())
    throw new UnauthorizedAccessException..

Pero si enumero explícitamente las propiedades de las credenciales en un objeto anónimo, funciona bien:

const string qryCheckCredentials = "SELECT 1 AS Authenticated FROM dbo.KIUser WHERE Username=@Username AND Password=@PasswordMD5";
if (!sqlConn.Query<Boolean>(qryCheckCredentials, param: new { Username = credentials.Username, PasswordMD5 = credentials.PasswordMD5 } ).FirstOrDefault<Boolean>())
    throw new UnauthorizedAccessException..

¿Alguna idea de por qué? Estoy recibiendo este problema en todo mi código y no puedo ver un patrón ni averiguar qué me falta.

El tipo de credenciales:

[DataContract]
public class Credentials
{
    [DataMember]
    public string Username;
    [DataMember]
    public string PasswordMD5;
}

Ocurre con muchos tipos, y la lista a través de ellos resuelve el problema de manera explícita.

(Las decoraciones de los atributos DataContract / DataMember se deben a que el objeto forma parte de una interfaz WDSL, probablemente irrelevante, pero que se deja aquí en caso de que sean relevantes por alguna razón que escapa a mi conocimiento).

Respuesta aceptada

Mi mejor suposición es que Dapper solo mira las propiedades, no los campos. Intente cambiar su clase a lo siguiente y vea si funciona.

[DataContract]
public class Credentials
{
    [DataMember]
    public string Username {get; set;}
    [DataMember]
    public string PasswordMD5 {get; set;}
}

Por lo general, se considera una mejor práctica usar propiedades públicas de todos modos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué