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 实体所需的那些列。
我有 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 实体所需的那些列。