使用AutoMapper.Data

时间:2018-10-22 14:57:00

标签: c# automapper dto

我的应用程序从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; }
}

我无法更改数据库类型,并且希望显示出更多类似的不一致之处,所以我认为我已经配置了自动映射器。

类似的东西:

  • 如果DTO的属性是X类型,并且为其分配的值是特定类型,请使用此显式转换。

例如

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>时,我找不到任何有关如何指定自定义配置的文档或示例。

0 个答案:

没有答案