Почему dapper возвращает все нули для Guid при выполнении выбора, но значение guid в таблице установлено правильно? - PullRequest
4 голосов
/ 08 мая 2019

Я использую dapper для запроса данных из таблицы, а затем приведу их к объекту. Когда он приводится к объекту, свойство guid устанавливается на все нули, но все остальные реквизиты устанавливаются правильно.

public class UserStuff
{
    public int Id { get; set; }
    public Guid UId { get; set; }
}


public async Task<UserStuff> GetUserStuff(Guid uId){
  using(IDbConnection conn = Connection){
    string sQuery = "SELECT TOP 100 id, u_id " +
                    "FROM TestTable WHERE u_id = @u_id ";
    conn.Open();
    var result = await conn.QueryAsync<UserStuff>(sQuery, new { u_id = uId });
    return result.FirstOrDefault();
  }
}

Пример данных SQL:

id | u_id

5 | C9DB345B-D460-4D71-87E0-D9A3B5CE1177

Возвращается: 5 для идентификатора и все нули для guid

Ответы [ 2 ]

4 голосов
/ 09 мая 2019

Основная проблема заключается в том, что имя вашего столбца и имя свойства различаются. Следовательно, даже если значение возвращается базой данных в результате запроса SQL, оно не сопоставляется с вашим свойством. Поскольку тип данных вашего свойства GUID, он содержит значение по умолчанию - все нули.

Картины Даппера на условных обозначениях; немного широкая тема для обсуждения. Для вашей конкретной проблемы имя вашего столбца и имя свойства должны совпадать. Существуют и другие способы правильного отображения, если они отличаются.

Я предложу простые решения здесь:

  1. Вы можете указать Dapper игнорировать подчеркивания в имени столбца при отображении.

    using Dapper;
    Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
    

    Установить это свойство при запуске проекта где-нибудь.

  2. Использовать псевдонимы столбцов в запросе SQL. Измените ваш SQL-запрос на что-то вроде следующего:

    SELECT TOP 100 id, u_id as UId....
    

    Таким образом, без изменения имени столбца и имени свойства, вы сможете правильно заполнить свойство, так как сопоставление исправлено.

  3. Либо измените имя столбца, чтобы оно соответствовало имени свойства, либо наоборот. Я не думаю, что это практично.

Помимо вышесказанного, есть также пользовательское сопоставление, доступное с dapper.

0 голосов
/ 09 мая 2019

Dapper сопоставляет столбцы со свойствами, если типы и свойства равны

Самый простой способ - настроить запрос

    string sQuery = "SELECT TOP 100 id, u_id as uid " +
                    "FROM TestTable WHERE u_id = @u_id ";

Просто подсказка: Вам не нужно открывать соединение вручную. Dapper сделает это за вас и закроет его после завершения или сбоя запроса, если состояние соединения равно closed. В более сложных сценариях это может быть необходимо, но в вашем случае это не так.

Еще один намек: Не используйте подчеркивания для имен столбцов в SqlServer. По соглашению в SqlServer мы должны использовать имена столбцов в верхнем верблюжьем регистре.

...