2011-07-29 2 views
1
using (IDataReader dr = DatabaseContext.ExecuteReader(command)) 
     { 
      if (dr.Read()) 
      { 
       AutoMapper.Mapper.CreateMap<IDataReader, ProductModel>(); 
       return AutoMapper.Mapper.Map<IDataReader, IList<ProductModel>>(dr); 
      } 
      return null; 
     } 

если д-р имеет только одна строка -> ошибка: бросил исключение типа «Microsoft.CSharp.RuntimeBinder.RuntimeBinderException»AutoMapper со списком данных IDataReader

если д-р имеет больше чем один ряд, он работает ok.

любая помощь?

ответ

6

Проблема заключается в том, что Automapper также вызывает Read(), поэтому пытается всегда смотреть на вторую запись вперед. Если вы думаете об этом, если у вас есть 1000 строк в читателе - как AutoMapper собирается преобразовать это в список без повторения через них всех вызовов Read()?

Изменить строку для вызова HasRows

например

using (IDataReader dr = DatabaseContext.ExecuteReader(command)) 
    { 
     if (dr.HasRows) 
     { 
      AutoMapper.Mapper.CreateMap<IDataReader, ProductModel>(); 
      return AutoMapper.Mapper.Map<IDataReader, IList<ProductModel>>(dr); 
     } 

     return null; 
    } 
+0

благодарственное, но вы ... AutoMapper.Mapper.CreateMap > (); или AutoMapper.Mapper.CreateMap (); верно? Я вижу, что оба они работают okey! – vNext

+1

Я всегда предпочитаю быть более явным, поэтому IList . Это, вероятно, делает магию так, что это не имеет значения внутри. –

0

Добавить AutoMapper.Net4 и добавьте картографами впереди CreateMap, как показано ниже:

MapperRegistry.Mappers.Add(new DataReaderMapper()); 
    MapperRegistry.Mappers.Add(new NameValueCollectionMapper()); 
    MapperRegistry.Mappers.Add(new HashSetMapper()); 
    MapperRegistry.Mappers.Add(new ListSourceMapper()); 
    MapperRegistry.Mappers.Add(new TypeConverterMapper()); 
Смежные вопросы