【问题标题】:Dapper mapping throws invalid castDapper 映射抛出无效的演员表
【发布时间】:2018-11-18 01:34:49
【问题描述】:

两个表:

+-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 个小时在这上面,但不知道发生了什么。

【问题讨论】:

    标签: c# sql wpf dapper


    【解决方案1】:

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

    【讨论】:

    • 好吧,就是这样,我不确定我为什么要亲自查询额外的排名。至于splitOn,我还以为默认是Id呢?
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多