Dapper Query 错误地映射了实体 ID

Dapper Query incorrectly maps the entity ID

我有 2 个实体 类:

public class PostTag
{
    public int Id { get; set; }
    public string Alias { get; set; }
    public string Name { get; set; }
    public int Level { get; set; }
}

public class PostTagIndex
{
    public int Id { get; set; }
    public int PostTagId { get; set; }
}

我想提请注意,他们都有一个名为 'Id' 的字段。

接下来,我这样使用 Query(...) 方法:

List<PostTag> postTags
    = cn.Query<PostTag>(postTagsSql, new { postId }).AsList();

这里是生成的SQL:

exec sp_executesql N'
            SELECT *
            FROM [PostTags] AS pt
            JOIN [PostTagIndexes] AS pti
            ON pt.[Id] = pti.[PostTagId]
            WHERE ([PostId] = @postId)',N'@postId int',@postId=3035

结果如下:

Id      Alias   Name    Level   Id      PostId  PostTagId
1014    name1   Name1   0       2020    3035    1014
2014    name2   Name2   1       3021    3035    2014

因此,由于加入并选择了所有列,结果有两个 'Id' 列。

我希望将第一列 'Id' 值放入 PostTag.Id。这不符合逻辑吗?但实际上,它将第二个 'Id' 列作为 PostTags 的 id。当然,我可以写 SELECT pt.* 而不仅仅是 SELECT *,但无论如何,为什么它不采用第一个合适的列名而不是跳过它呢?

我不认为第一个 ID 被跳过了。我怀疑它正在 over-written 秒。

因此,Dapper 映射器模块开始映射。它找到第一个 ID 列。它正确映射它。然后它还映射其他列。然后它再次找到 ID 列并再次正确映射它。

正如我上面所说,这是我怀疑的。您可能想看看 Dapper 源代码以确保。

正如您在问题中所说,SELECT pt.* 是一种解决方案。其他可能是为 pti.ID AS PTI_ID 或其他东西使用不同的别名。

映射时也会考虑数据类型。但我想这是你无法改变的。

post 讨论了当其中一个是 null 时映射重复列。

在这种情况下,恐怕您没有正确使用 Dapper。您的 SQL 正在返回 2 个实体值的列,但您要求 Dapper 仅映射到其中一个。

您应该使用 multi-mapping 查询或 select 只使用 PostTag 实体所需的那些列。