Pergunta

Estou usando o AutomApper para DataReader usando o código, conforme discutido abaixohttp://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

Eu vejo isso sendo muito esquisito ... e imprevisível.

1) O mesmo código com o mesmo DataReader às vezes traz valor de volta ao conjunto de resultados DTO e às vezes não. 2) Eu tenho um valor de identificação proveniente do banco de dados como 100, 200. Quando ele mapeia para o DTO que é do tipo inteiro, esse 100 é alterado para um grande valor (como 234343211).

Quaisquer idéias sobre por que estou vendo esse inconsistente. Devo estar usando o padrão while (leitor.read ())? e parar de usar o AutomApper?

Foi útil?

Solução

Eu encontrei esse mesmo problema. Parece ocorrer quando o tipo de fonte e o tipo de destino não são exatamente iguais.

No meu caso, eu tinha uma tabela de servidor SQL com um campo de identificação que era do tipo int. O valor estava sendo mapeado para uma classe com uma propriedade que era de tipo longa (INT64). Isso resultaria no valor esperado de 100 sendo mapeado para algo como 668386727769314912. Depois de alterar o esquema da tabela para que o ID seja um bigint, os valores sempre mapeados corretamente.

Eu recomendaria procurar atentamente o tipo de fonte e o tipo de destino para garantir que eles sejam exatamente os mesmos. Aparentemente, as conversões que você esperaria trabalhar implicitamente (como o INT32 a INT64) podem causar problemas.

Aqui está um exemplo que reproduzirá o problema:

public class DataMapperIssue
{
    public class Person
    {
        public long id { get; set; }
        public string first_name { get; set; }
        public string last_name { get; set; }
    }

    public static void run()
    {
        var table = new DataTable();

        table.Columns.Add("id", typeof(int));
        table.Columns.Add("first_name", typeof(string));
        table.Columns.Add("last_name", typeof(string));

        table.Rows.Add(100, "Jeff", "Barnes");
        table.Rows.Add(101, "George", "Costanza");
        table.Rows.Add(102, "Stewie", "Griffin");
        table.Rows.Add(103, "Stan", "Marsh");
        table.Rows.Add(104, "Eric", "Cartman");

        AutoMapper.Mapper.Reset();
        AutoMapper.Mapper.CreateMap<IDataReader, Person>();

        var results = AutoMapper.Mapper.Map<IDataReader, IList<Person>>(table.CreateDataReader());
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top