2013-09-17 2 views
5

Я использую Dapper в репозитории для сопоставления результатов запроса со списком типа DTO для возврата моего API. Кажется, что все работает правильно, но после завершения запроса и сопоставления в списке заполняется правильное количество объектов, но все свойства int равны 0, а строки - null. Я использовал Dapper совсем немного в других проектах и ​​никогда не сталкивался с этим раньше. Я также проверил, что данные верны, и если я копирую запрос в SQL Management Studio, он дает мне правильные данные.Почему мои объекты, возвращаемые из Dapper, имеют значения null и значения по умолчанию?

Вот конструктор базового класса моего репозитория, содержащий логику пользовательского отображения. Я подтвердил, что этот код получает удар.

static BaseRepository() 
{ 
    SqlMapper.SetTypeMap(typeof(T), 
     new CustomPropertyTypeMap(
      typeof(T), (type, columnName) => type.GetProperties() 
       .FirstOrDefault(prop => prop.GetCustomAttributes(false) 
         .OfType<ColumnAttribute>() 
         .Any(attr => attr.Name == columnName)))); 
} 

Вот метод хранилища для заполнения списка:

public IEnumerable<Dog> GetAll() 
{ 
    var dogs = Db.Query<Dog>(@"SELECT Id, Name FROM Dogs"); 
    return dogs; 
} 

А вот мой объект:

[DataContract] 
public class Dog 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

Так что я подтвердил, что «собаки» переменная получает заселена , но все элементы Id и Name равны 0 или null. Вот что конечный результат JSON выглядит следующим образом:

[ 
    { 
     Id: 0, 
     Name: null 
    }, 
    { 
     Id: 0, 
     Name: null 
    }, 
    { 
     Id: 0, 
     Name: null 
    } 

] 

Я также попытался добавить столбец атрибутов свойств, как [Column(Name = "Id")]. Еще не повезло. Что я не замечаю?

Edit: Я был в состоянии решить эту проблему, используя пример кода, и суть в этом related answer.

ответ

2

У вас, кажется, есть пользовательская карта, которая использует [Column("Id")] и т. Д. Для определения/распознавания столбцов. Однако вы не добавили этот атрибут - поэтому столбцов не будет найден ...

+0

Спасибо, но это тоже не сработало. Я упомянул в нижней части своего сообщения, что я включил [Column (Name = "Id")], который, как я думал, был правильным форматом для моей пользовательской карты. И не атрибут карты, как этот необязательный, если имена полей совпадают? Тем не менее - я попытался полностью удалить настраиваемое сопоставление, и он работал на этот раз (так как имена столбцов совпадают в этом случае), так что это четко, где моя проблема. Но мне нужно выяснить, как заставить карту работать для других несогласованных столбцов. – Raelshark

+1

Хорошо, я сделал еще несколько исследований и нашел [этот ответ] (http://stackoverflow.com/a/12615036/19678), в котором рассматривается, как это сделать. Похоже, что я получил первую часть своего ответа откуда-то, но все остальное. Спасибо за помощь. – Raelshark

Смежные вопросы