Я только начал смотреть на Dapper.net и экспериментировал с разными запросами, один из которых дает странные результаты, которых я не ожидал.
У меня есть 2 таблицы - Фото
и Категории фотографий
, из которых связаны на CategoryID
Таблица фотографий
PhotoId (PK - int)
CategoryId (FK - smallint)
UserId (int)
Таблица категорий фотографий
CategoryId (PK - smallint)
CategoryName (nvarchar(50))
Мои 2 класса:
public class Photo
{
public int PhotoId { get; set; }
public short CategoryId { get; set; }
public int UserId { get; set; }
public PhotoCategory PhotoCategory { get; set; }
}
public class PhotoCategory
{
public short CategoryId { get; set; }
public string CategoryName { get; set; }
{
Я хочу использовать множественное сопоставление, чтобы вернуть экземпляр Photo
с заполненным экземпляром связанной PhotoCategory
.
var sql = @"select p.*, c.* from Photos p inner
join PhotoCategories c
on p.CategoryID = c.CategoryID where p.PhotoID = @pid";
cn.Open();
var myPhoto = cn.Query<Photo, PhotoCategory, Photo>(sql,
(photo, photoCategory) => { photo.PhotoCategory = photoCategory;
return photo; },
new { pid = photoID }, null, true, splitOn: "CategoryID").Single();
Когда это выполняется, не все свойства заполняется (несмотря на одинаковые имена в таблице БД и в моих объектах.
Я заметил, что если я не
'select p. * etc.' в моем SQL
, и вместо этого.
Я явно указываю поля.
Я хочу вернуть ИСКЛЮЧАЯ
p.CategoryId
из запроса, тогда все будет заполнено (кроме, очевидно, CategoryId против Объект Photo, который я исключил из оператора select).
Но я ожидал, что смогу включить это поле в запрос и получить его, а также все остальные поля, запрашиваемые в SQL
, чтобы заполнить.
Я мог бы просто исключить свойство CategoryId
из моего класса Photo
и всегда использовать Photo.PhotoCategory.CategoryId
, когда я требуется идентификатор.
Но в некоторых случаях я могу не захотеть заполнять объект PhotoCategory
, когда я получаю экземпляр
объект Photo.
Кто-нибудь знает, почему происходит такое поведение? Это нормально для Dapper?