我的应用程序从Sql Server或Oracle数据库中读取。
大多数查询非常简单,并且大多数时候查询语义没有差异。我决定不使用数据集,而是直接将结果转换为DTO:
SomeDto data = GetResult<SomeDto>("SELECT * FROM table");
在GetResult
方法中,我使用带有AutoMapper
扩展名的AutoMapper.Data
。以下是GetResult
方法的简化内容。
public IEnumerable<T> GetResult(string query)
{
using(DbConnection db = GetConnection())
{
var command = db.CreateCommand()
command.CommandText = query;
return mapper.map<IDataReader, IEnumerable<T>>(dataReader);
}
}
借助AutoMapper.Data扩展,我能够使用automapper配置将数据读取器直接转换为DTO。
cfg.AddDataReaderMapping();
问题
Oracle和Sql Server数据库具有相同的结构,但是列类型中存在一些不一致之处。
例如,Oracle的NUMBER(8)
被解释为int
,而Sql Server的NUMBER(8,0)
被解释为decimal
,尽管它实际上始终是整数(是的,应该为int但我对此无能为力)。如果DTO中的目标类型不对应,则抛出类型不匹配异常。
public class SomeDto
{
//works fine with Oracle
//throws exception when using Sql Server
public int ID { get; set; }
}
我无法更改数据库类型,并且希望显示出更多类似的不一致之处,所以我认为我已经配置了自动映射器。
类似的东西:
例如
mapper.map<IDataReader, IEnumerable<T>>(dataReader, options => {
options.ConfigureMap()
//simple explicit cast, no loss of precision expected
.UseThisCastWhenMappingToDTO<decimal, int>(decimalInput => (int)decimalInput);
});
问题
使用AutoMapper可以说UseThisCastWhenMappingToDTO<TSource, TTarget>
吗?
因为看起来好像有可能,但是我不知道该怎么做。在将IDataReader
映射到IEnumerable<T>
时,我找不到任何有关如何指定自定义配置的文档或示例。