Dapper не будет читать свойства объекта, если явно не указано как анонимный тип

c# dapper

Вопрос

По умолчанию Dapper Query не заполняет параметры свойств типизированных объектов.

Следующий код генерирует исключение, говорящее, что я должен объявлять @Username, даже если учетные данные содержат credentials.Username свойств. Имя пользователя:

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..

Но если я перечислю свойства учетных данных явно в анонимный объект, он отлично работает:

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..

Любые идеи почему? Я получаю эту проблему по всему моему коду и не вижу шаблона или не понимаю, что мне не хватает.

Тип учетных данных:

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

Случается со многими типами, и перечисление через них явно исправляет проблему.

(Декорации атрибутов DataContract / DataMember связаны с тем, что объект является частью интерфейса WDSL - возможно, не имеет значения, но оставлен здесь, если они релевантны по какой-то причине, кроме моих знаний).

Принятый ответ

Мое лучшее предположение заключается в том, что Dapper рассматривает только свойства, а не поля. Попробуйте изменить класс на следующее и посмотреть, работает ли он.

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

Как правило, считается, что лучше использовать публичные свойства в любом случае.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему