首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dapper映射引发无效的强制转换

Dapper映射引发无效的强制转换
EN

Stack Overflow用户
提问于 2018-11-18 01:34:49
回答 1查看 909关注 0票数 0

两张表:

代码语言:javascript
运行
复制
+-Person-+       +--Rank--+
| Id     |       | Id     |
| FName  |       | Name   |
| LName  |       +--------+
| Rank   |
+--------+

对象模型看起来完全相同,除了Person中的Rank类型为RankModel而不是int。

我对它们做了一个简单的内部连接:

代码语言:javascript
运行
复制
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地图:

代码语言:javascript
运行
复制
return connection.Query<PersonModel, RankModel, PersonModel>(sql, (per, rank) =>
    {
    per.Rank = rank;
    return per;
    }).ToList();

但我有个例外:

代码语言:javascript
运行
复制
InvalidCastException: Invalid cast from 'System.Int16' to 'MainDB.Models.RankModel'.

显然,它试图将int强制转换到RankModel,但我不知道为什么--它应该将返回分割成两个对象,然后将RankModel对象附加到PersonModel对象的Rank属性中。这简直把我逼疯了,我花了3个小时在这上面,弄不清楚到底发生了什么事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-18 02:13:25

您需要在查询语句中添加'splitOn‘param,以便将它们拆分为Person,Rank模型对象。

另外,您的sql需要重构如下

代码语言:javascript
运行
复制
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";

你的声明应该是

代码语言:javascript
运行
复制
return connection.Query<PersonModel, RankModel, PersonModel>(sql, (per, rank) =>
    {
    per.Rank = rank;
    return per;
    }, splitOn:"Id,Id").ToList();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53357149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档