Dapper Multi Mapping останавливается при вложении 3-го уровня

#c# #dapper

#c# #dapper

Вопрос:

Я взял вопрос и изменил его, чтобы сформировать свой вопрос. У меня есть запрос, который правильно отображается из начального класса во второй класс и элементы, присоединенные ко второму классу (3-му), но не элементы, присоединенные к 3-му классу. пример следующий.

 public class Part {

 public int Id { get; set; }
  public string Name { get; set; }

  public Address Address { get; set; }
}

public class Address {
  public int Id { get; set; }
  public string Street { get; set; }

  public SiteOu Ou { get; set; }
}

public class SiteOu {
  public int Id { get; set; }

  public SiteOuName SiteOuN { get; set; }
}

public class SiteOuName
{
public int Id { get; set; }
  public string Name { get; set; }
}
 

Dapper:

 public void TestSplitOn()
{
    var conn = new SqlConnection(@"Data Source=.SQLEXPRESS;Integrated Security=true;Initial Catalog=db");
    conn.Open();
    const string sql = "select Id = 1, Name = 'My Part', "  
                       "Id = 2, Street = 'My Street', "  
                       "Id = 1, SiteOuNameId = '1'"  
                       "Id = 1, Name = 'My Site', "  ;
    var result = conn.Query<Part, Address, SiteOu, SiteOuName, Part>(sql, (part, address, siteOu, siteOuName) =>
    {
        part.Address = address;
        address.Ou = siteOu;
        SiteOu.SiteOuName = siteOuName
        return part;
    },
    commandType: CommandType.Text
    ).FirstOrDefault();
}
 

Если я удаляю SiteOuName из сопоставления Dapper, код работает, но не отображает объект SiteOuName, но когда я оставляю его как есть, он показывает мне, что ссылка на объект address равна null.

Ответ №1:

Насколько я вижу, в вашем коде Dapper есть несколько проблем. Во-первых, ваш запрос должен быть похож;

 const string sql = "select Id = 1, Name = 'My Part', "  
                           "Id = 2, Street = 'My Street', "  
                           "Id = 1, SiteOuNameId = '1',"  
                           "Id = 1, Name = 'My Site'";
 

У вас отсутствует запятая рядом с SiteOuNameId = ‘1’, и у вас есть лишняя запятая и знак ‘ ‘ рядом с Name = ‘Мой сайт’

Во-вторых, ваше отображение неверно, оно должно быть похоже

 part.Address = address;
address.Ou = siteOu;
siteOu.SiteOuN = siteOuName;
return part;
 

В вашем коде S — это верхний регистр, что заставляет разработчика думать, что вы используете класс SiteOu.
Кроме того, у класса SiteOu нет свойства с именем SiteOuName, оно должно быть SiteOuN .