2017-02-16 5 views
0

Что такое правильный способ использования automapper с ado.net в asp.net core в общем виде? Также запрос Sql имеет те же имена столбцов, что и в классе <T> В указанном примере переменная result всегда является пустым списком, поэтому automapper не смог сопоставить свойства объектов с столбцами DbDataReader.ASP.NET CORE с использованием ADO.NET с AutoMapper

public class CustomDbContext : BaseRepository 
{ 
    readonly DbConnection dbConn; 
    public CustomDbContext(RepoDbContext context) : base(context) 
    { 
     dbConn = context.Database.GetDbConnection(); 
    } 

    public async Task<List<T>> Get<T>(string sql) where T : class 
    { 
     var config = new AutoMapper.MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<DbDataReader, List<T>>(); 
     }); 

     var mapper = config.CreateMapper(); 
     await dbConn.OpenAsync(); 
     using (var command = dbConn.CreateCommand()) 
     { 
      command.CommandText = sql; 
      var reader = await command.ExecuteReaderAsync(); 
      var result = new List<T>(); 
      if (reader.HasRows) 
      { 
       await reader.ReadAsync(); 
       result = mapper.Map<DbDataReader, List<T>>(reader); 
      } 
      reader.Dispose(); 
      return result; 
     } 
    } 
} 

Должен ли я указать более подробную конфигурацию automapper или это невозможно сделать таким образом?

ответ

0

Попробуйте использовать интерфейсы как IDataReader и IEnumerable вместо классов DbDataReader и списка.

public async Task<List<T>> Get<T>(string sql) where T : class 
{ 
    var config = new AutoMapper.MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<IDataReader, IEnumerable<T>>(); 
    }); 

    var mapper = config.CreateMapper(); 
    await dbConn.OpenAsync(); 
    using (var command = dbConn.CreateCommand()) 
    { 
     command.CommandText = sql; 
     var reader = await command.ExecuteReaderAsync(); 
     var result = new List<T>(); 
     if (reader.HasRows) 
     { 
      await reader.ReadAsync(); 
      result = mapper.Map<IDataReader, IEnumerable<T>>(reader).ToList(); 
     } 
     reader.Dispose(); 
     return result; 
    } 
} 
+0

В этом случае 'mapper.Map > (читатель)' 'возвращает null' – Brivvirs

Смежные вопросы