2017-02-16 7 views
0

Was ist die richtige Art der Verwendung von automapper mit ado.net in asp.net core in generischer Weise? Auch die Sql-Abfrage hat die gleichen Spaltennamen wie in der Klasse <T> In der angegebenen Beispielvariable result ist immer eine leere Liste, sodass der Autoadapter keine Objekteigenschaften den DbDataReader-Spalten zuordnen konnte.ASP.NET CORE mit ADO.NET mit 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; 
     } 
    } 
} 

Sollte ich eine detailliertere Autoadapter-Konfiguration angeben, oder kann das nicht auf diese Weise gemacht werden?

Antwort

0

Verwenden Sie die Schnittstellen IDataReader und IEnumerable anstelle der Klassen DbDataReader und List.

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

In diesem Fall 'mapper.Map > (Reader)' 'kehrt null' – Brivvirs