AutoMapper: mapeamento entre um objeto IDataReader e DTO

Eu tenho um DataReader que contém o resultado de um procedimento armazenado. A convenção de nomenclatura para as colunas usa sublinhados para espaços.

Eu consegui mapear com êxito entre IDataReader e IEnumerable, mas somente se os campos corresponderem exatamente. Eu não quero a convenção de nomenclatura usada nos procedimentos armazenados para ditar a maneira que eu nomeia campos em meus objetos. E o mesmo é verdade no lado do banco de dados. Eu não acho que seria bem-sucedido impondo o Pascal Case aos DBAs.

Eu gostaria de evitar ter que usar ForMember () foreach campo eu preciso mapear. Isso frustraria o propósito de usar o AutoMapper.

Achei umpostagem anterior sobre o tópico que usei como referência em meus testes. Eu não consegui obter a configuração correta / mapeamento para o teste passar com êxito. Eu espero que alguém possa ajudar.

public class DataReaderTests
{
    private DTOObject _result;
    private IDataReader _dataReader;

    protected override void Establish_context()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
            cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
            cfg.CreateMap<IDataReader, IEnumerable<DTOObject>>();
        });

        _dataReader = new DataBuilder().BuildDataReader();
        _result = Mapper.Map<IDataReader, IEnumerable<DTOObject>>(_dataReader).FirstOrDefault();
    }

    [Test]
    public void Then_a_column_containing_phone_number_should_be_read()
    {
        Assert.That(_result.PhoneNumber, Is.EqualTo(_dataReader[FieldName.PhoneNumber]));
    }
}

public class DataBuilder
{
    public IDataReader BuildDataReader()
    {
        var resultData = new DataTable();    
        resultData.Columns.Add(FieldName.PhoneNumber, typeof(string));

        var resultDataRow = resultData.NewRow();
        resultDataRow[FieldName.PhoneNumber] = "111-222-3333";

        resultData.Rows.Add(resultDataRow);

        return resultData.CreateDataReader();
    }
}

internal class FieldName
{
    public const String Id = "id";
    public const String Name = "name";
    public const String PhoneNumber = "phone_number";
    public const String CreateDate = "create_date";   
}

public class DTOObject
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
    public DateTime CreatedDate { get; set; }
}

questionAnswers(2)

yourAnswerToTheQuestion