Dapper SetTypeMap 破坏了 DapperExtension 的 ClassMapper

Dapper SetTypeMap Breaks DapperExtension's ClassMapper

在我的项目中,我使用自定义 SqlMapper 在 dapper 中映射我的 Db 列,但是当我设置 Dapper 以使用我的自定义类型映射器时:

Dapper.SqlMapper.SetTypeMap(typeof(User), new UserMapper());

DapperExtension 不再能够映射我的用户 class 所以当我这样做时:

User item = cn.Get<User>(id);

此项仅包含默认值。

我的 UserMapper 不干扰 DapperExtensions 的 ClassMapper 实现,它只实现 SqlMapper.ITypeMap

您认为它会以任何方式覆盖 DapperExtensions 功能吗? 感谢您的帮助

经过进一步排查,终于找到并解决了问题: 假设我有一个 TestClass,其中 属性 Id 在我的 UserMapper 中映射到数据库列 UserId.

  • Dapper 执行查询时(例如 SELECT * FROM Users),它询问我的 UserMapper 属性 它可以将列映射到哪个"UserId"(=> ID)。
  • DapperExtension 执行查询时,它询问我的 UserMapper 属性 它可以将列 "Id" 映射到哪个(=>?)。这是因为 DapperExtension 像 "SELECT UserId As Id FROM Users" 一样执行查询,所以该列已经被映射,但是我的 UserMapper 找不到用 Name = Id 映射的 IPropertyMap。

通过检查是否搜索具有 ColumnName = Id 的 IPropertyMap 失败来解决;如果是这样,我通过使用 Name = Id.

搜索 IPropertyMap 来回退

如果您认为可以用更好的方式解决这个问题,请告诉我 谢谢!