Я использую 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.
Спасибо, но это тоже не сработало. Я упомянул в нижней части своего сообщения, что я включил [Column (Name = "Id")], который, как я думал, был правильным форматом для моей пользовательской карты. И не атрибут карты, как этот необязательный, если имена полей совпадают? Тем не менее - я попытался полностью удалить настраиваемое сопоставление, и он работал на этот раз (так как имена столбцов совпадают в этом случае), так что это четко, где моя проблема. Но мне нужно выяснить, как заставить карту работать для других несогласованных столбцов. – Raelshark
Хорошо, я сделал еще несколько исследований и нашел [этот ответ] (http://stackoverflow.com/a/12615036/19678), в котором рассматривается, как это сделать. Похоже, что я получил первую часть своего ответа откуда-то, но все остальное. Спасибо за помощь. – Raelshark