2010-03-11 17 views
6

estoy usando AutoMapper a dataReader utilizando el código como veremos a continuación http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/AutoMapper Mapeo IEnumerable a DataReader Edición

veo que sea muy flakky ... e impredecible.

1) Mismo código con el mismo lector de datos a veces devuelve valor al conjunto de resultados dto y en ocasiones no lo hace. 2) Tengo un valor ID que proviene de la base de datos como 100, 200. Cuando se asigna a la DTO que es de tipo entero, este 100 se cambia a un valor grande (como 234343211).

Alguna idea sobre por qué estoy viendo esta inconsistencia. ¿Debería usar el estándar mientras (reader.Read())? y dejar de usar Automapper?

+1

Hmmm ... muy extraño ... ¿sería posible para que me envíe algunos datos de ejemplo y un objeto de origen de ejemplo que muestra el problema ? Eso debería ayudarme a reducirlo. ¡Gracias! –

Respuesta

18

Me encontré con este mismo problema. Parece que ocurre cuando el tipo de fuente y el tipo de destino no son exactamente iguales.

En mi caso, tenía una tabla de SQL Server con un campo ID que era de tipo INT. El valor se estaba asignando a una clase con una propiedad que era de tipo largo (Int64). Esto daría como resultado que el valor esperado de 100 se asignara a algo como 668386727769314912. Después de cambiar el esquema de la tabla para que ID sea un BIGINT, los valores siempre se correlacionaron correctamente.

Recomendaría mirar de cerca el tipo de fuente y el tipo de destino para asegurar que sean exactamente iguales. Aparentemente, las conversiones que esperaría que funcionaran implícitamente (como Int32 a Int64) pueden causar problemas.

Aquí es un ejemplo que reproducir el 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()); 
    } 
} 
+0

Esto funciona como un encanto! Gracias. –