使用IDbMapper映射时int转System.String报错,如何解决?
解决IDataReader映射时int转string的类型转换问题
数据库返回的Id字段为int类型,但C#实体类Items的Id属性定义为string,导致自动映射时抛出类型转换错误,以下是几种可行的解决方法:
自定义映射规则(适配IDbMapper)
如果你的IDbMapper支持自定义属性级别的映射逻辑,可以针对Items.Id配置转换规则,读取数据库的int值后转为string:// 假设IDbMapper提供ConfigureProperty方法用于自定义映射 _dbMapperItems.ConfigureProperty<Items>(item => item.Id, reader => { int ordinal = reader.GetOrdinal("Id"); return reader.IsDBNull(ordinal) ? null : reader.GetInt32(ordinal).ToString(); });之后再执行
_dbMapperItems.Map(reader)即可完成正确转换。修改实体类的属性转换逻辑
调整Items类的Id属性,通过私有字段存储原始int值,对外暴露string类型的访问器:public class Items { private int? _id; public string Id { get => _id?.ToString(); set => int.TryParse(value, out int parsedId) ? _id = parsedId : _id = null; } public string Name { get; set; } }这种方式需要确保你的
IDbMapper能够正确映射到私有字段(如果映射器默认只处理公共属性,可能需要额外配置)。手动读取并转换(最直接的方式)
放弃自动映射,手动遍历IDataReader并完成字段转换:if (reader.NextResult()) { int idOrdinal = reader.GetOrdinal("Id"); int nameOrdinal = reader.GetOrdinal("Name"); while (reader.Read()) { types.Add(new Items { Id = reader.IsDBNull(idOrdinal) ? null : reader.GetInt32(idOrdinal).ToString(), Name = reader.IsDBNull(nameOrdinal) ? null : reader.GetString(nameOrdinal) }); } }这种方式完全控制字段的读取和转换逻辑,无需依赖映射器的自动处理。
注册全局类型转换器(针对第三方ORM)
如果使用的是类似Dapper这类第三方ORM实现的IDbMapper,可以注册全局类型转换器处理int到string的转换:public class IntToStringTypeHandler : SqlMapper.TypeHandler<string> { public override string Parse(object value) { return value?.ToString(); } public override void SetValue(IDbDataParameter parameter, string value) { // 如需反向写入数据库,添加string转int的逻辑 parameter.Value = int.TryParse(value, out int result) ? result : DBNull.Value; } } // 注册转换器 SqlMapper.AddTypeHandler(new IntToStringTypeHandler());注册后,ORM会自动处理所有int到string类型的映射转换。
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

