Dapper映射抛出无效的转换

时间:2018-11-18 01:34:50

标签: c# sql wpf dapper

两个表:

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

对象模型的外观完全相同,只是“在人员中的等级”是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对象附加到PersonModel对象的Rank属性中。这让我发疯,我已经花了3个小时来弄清楚发生了什么。

1 个答案:

答案 0 :(得分:2)

您需要在查询语句中添加'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();