2010-03-11 14 views
6

Sto usando automapper al DataReader utilizzando il codice come descritto di seguito http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/automapper Mapping IEnumerable al DataReader Problema

vedo io essendo molto flakky ... e imprevedibile.

1) Lo stesso codice con lo stesso datareader a volte riporta il valore al set di risultati dto e talvolta non lo fa. 2) Ho un valore ID proveniente dal database come 100, 200. Quando si associa al DTO che è di tipo intero questo 100 viene modificato in un valore grande (come 234343211).

Qualche idea su perché sto vedendo questa inconsistenza. Dovrei usare lo standard while (reader.Read())? e smetti di usare l'automapper?

+1

Hmmm ... molto strano ... sarebbe possibile per ricevere alcuni dati di esempio e un oggetto di origine di esempio che illustra il problema ? Questo dovrebbe aiutarmi a restringere il campo. Grazie! –

risposta

18

Mi sono imbattuto in questo stesso problema. Sembra che si verifichi quando il tipo di fonte e il tipo di destinazione non sono esattamente gli stessi.

Nel mio caso, avevo una tabella SQL Server con un campo ID di tipo INT. Il valore veniva mappato a una classe con una proprietà di tipo long (Int64). Ciò comporterebbe il valore previsto di 100 che viene mappato su qualcosa come 668386727769314912. Dopo aver modificato lo schema della tabella in modo che l'ID sia un BIGINT, i valori vengono sempre mappati correttamente.

Si consiglia di osservare attentamente il tipo di origine e il tipo di destinazione per garantire che siano esattamente uguali. Apparentemente, le conversioni che ci si aspetterebbe di lavorare implicitamente (come Int32 in Int64) possono causare problemi.

Ecco un esempio che riprodurre il 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

Funziona come un fascino! Grazie. –

Problemi correlati