大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述Dapper mapping会抛出无效的强制转换相关的知识,希望能为你提供帮助。
两张桌子:
+-Person-++--Rank--+
| Id|| Id|
| FName|| Name|
| LName|+--------+
| Rank|
+--------+
对象模型看起来完全相同,除了Rank in Person类型为RankModel而不是int。
【Dapper mapping会抛出无效的强制转换】我对它们进行简单的内连接:
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();
推荐阅读
- React app无法登录到控制台或终端窗口
- application.properties中的SpringBoot未知属性
- 运行Spring Boot APP时出现Spring Boot问题
- 在Android SQLITE中删除多行
- 如何从表1中检索列数据并使用SQLite数据库将该列值插入到Android Studio的表2中()
- 为什么考虑重新设计网站-提示和建议
- 设计的推动力–网站重新设计案例研究
- 可读性设计– Web排版指南(带有信息图)
- 视觉保存期限–为什么网页设计插图会过时