Dapper mapping会抛出无效的强制转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dapper mapping会抛出无效的强制转换相关的知识,希望对你有一定的参考价值。

两张桌子:

+-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对象附加到PersonModel对象的Rank属性中。这让我发疯,我已经花了3个小时在这上面,无法弄清楚发生了什么。

答案

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

以上是关于Dapper mapping会抛出无效的强制转换的主要内容,如果未能解决你的问题,请参考以下文章

C# LINQ/EF 在具有值转换的属性上抛出无效强制转换

为啥 jsonwebtoken 会抛出“无效签名”错误?

为啥当 hjust 和 vjust 是字符串时 geom_text() 会抛出强制错误?

.NET Dapper 可为空的强制转换错误

为什么基于索引抓取子项时颤振会抛出无效的参数?

在c#中将基类动态转换为子类