Изумительное отображение бросает недопустимое приведение - PullRequest
0 голосов
/ 18 ноября 2018

Два стола:

+-Person-+       +--Rank--+
| Id     |       | Id     |
| FName  |       | Name   |
| LName  |       +--------+
| Rank   |
+--------+

Объектная модель выглядит точно так же, за исключением того, что Rank in Person имеет тип RankModel вместо int.

Я делаю на них простое внутреннее соединение:

string sql = "SELECT pe.Id, pe.LName, pe.FName, pe.Rank, ra.Id, ra.Name" +
             "FROM Person pe INNER JOIN Rank ra ON ra.Id = pe.Rank";

Затем я использую Dapper для отображения:

return connection.Query<PersonModel, RankModel, PersonModel>(sql, (per, rank) =>
    {
    per.Rank = rank;
    return per;
    }).ToList();

Но я получаю исключение:

InvalidCastException: Invalid cast from 'System.Int16' to 'MainDB.Models.RankModel'.

Ясно, что он пытается привести int к RankModel, но я не могу понять, почему - он должен разделить возвращаемый результат на два объекта и затем присоединить объект RankModel к свойству Rank объекта PersonModel. Это сводит меня с ума, я потратил на это 3 часа и не могу понять, что происходит.

1 Ответ

0 голосов
/ 18 ноября 2018

Вам нужно добавить параметр 'splitOn' в запросе, чтобы разделить их на объекты модели Person, Rank.

Также необходимо провести рефакторинг вашего sql, как показано ниже

string sql = "SELECT pe.Id, pe.LName, pe.FName, ra.Id, ra.Name" +
             "FROM Person pe INNER JOIN Rank ra ON ra.Id = pe.Rank";

И ваше заявление должно быть

return connection.Query<PersonModel, RankModel, PersonModel>(sql, (per, rank) =>
    {
    per.Rank = rank;
    return per;
    }, splitOn:"Id,Id").ToList();
...