J'ai un DataReader qui contient le résultat d'une procédure stockée. La convention de dénomination des colonnes utilise des traits de soulignement pour les espaces.AutoMapper: Mappage entre un IDataReader et un objet DTO
J'ai réussi à mapper entre IDataReader et IEnumerable, mais seulement si les champs correspondent exactement. Je ne veux pas que la convention de nommage utilisée dans les procédures stockées dicte la façon dont je nomme les champs dans mes objets. Et la même chose est vraie du côté de la base de données. Je ne pense pas que je réussirais à appliquer Pascal Case sur les DBA. Je voudrais éviter d'avoir à utiliser ForMember() pour chaque champ que j'ai besoin de mapper. Cela irait à l'encontre de l'objectif d'utiliser AutoMapper.
J'ai trouvé un previous post sur le sujet que j'ai utilisé comme référence dans mes tests. Je n'ai pas réussi à obtenir la configuration/mappage correct pour que le test réussisse. J'espère que quelqu'un peut aider.
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; }
}