AutoMapper: Zuordnung zwischen einem IDataReader- und einem DTO-Objekt

Ich habe einen DataReader, der das Ergebnis einer gespeicherten Prozedur enthält. Die Namenskonvention für die Spalten verwendet Unterstriche für Leerzeichen.

Ich konnte IDataReader und IEnumerable erfolgreich zuordnen, aber nur, wenn die Felder genau übereinstimmen. Ich möchte nicht, dass die in den gespeicherten Prozeduren verwendete Namenskonvention vorgibt, wie ich Felder in meinen Objekten benenne. Und das gilt auch für die Datenbankseite. Ich glaube nicht, dass es mir gelingen würde, Pascal Case bei den DBAs durchzusetzen.

Ich möchte vermeiden, ForMember () für jedes Feld verwenden zu müssen, das ich abbilden muss. Dies würde den Zweck der Verwendung von AutoMapper zunichte machen.

Ich habe einen ... gefundenvorherigen Post zu dem Thema, das ich in meinen Tests als Referenz verwendet habe. Es ist mir nicht gelungen, die richtige Konfiguration / Zuordnung für den erfolgreich bestandenen Test zu erhalten. Ich hoffe, dass jemand helfen kann.

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; }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage