【发布时间】:2020-09-01 19:00:48
【问题描述】:
我想我的代码中遗漏了一些导致此错误的内容:AutoMapperMappingException: Missing type map configuration or unsupported mapping. 这是我第一次尝试使用 autoMapper 从数据表中填充我的 dto。所以我从How do I use automapper to map a dataset with multiple tables 中找到了一个例子。所以这是我的代码:
public class ContractController : ApiController
{
private readonly IMapper _mapper;
public ContractController()
{
var mapperConfig = new MapperConfiguration(x =>
x.CreateMap<IDataReader, ContractListDto>());
_mapper = mapperConfig.CreateMapper();
}
[Route("api/Sales/ContractsList")]
[HttpGet]
public IHttpActionResult Get()
{
var salesHelper = new SalesHelper(enmSaleDocType.enmSaleDocType_SaleContract,
enmSaleAfterSaleMode.enmSaleAfterSaleMode_Sale,
enmSaleOperationType.enmSaleOperationType_Sales);
var saleDataTable = salesHelper.GetSales();
IEnumerable<ContractListDto> contractsDto = null;
using (var saleDataReader = saleDataTable.CreateDataReader())
{
contractsDto = _mapper.Map<IEnumerable<ContractListDto>>(saleDataReader);
}
return Ok(contractsDto);
}
}
我正在使用 api2 dotnet 框架和 automapper 版本 10。所以我无法在 globol.asax 中初始化 automapper。所以我尝试从构造函数中实现这一点,正如您在我的代码中看到的那样。(我可能在那里做错了什么!)。最后我在这里得到错误:
using (var saleDataReader = saleDataTable.CreateDataReader())
{
contractsDto = _mapper.Map<IEnumerable<ContractListDto>>(saleDataReader);
}
当我尝试映射时。感谢阅读。
【问题讨论】:
-
为什么要使用 AutoMapper?
GetSales是做什么的?如果您使用例如 EF Core 或Dapper,则不需要映射任何内容。您也不需要处理原始数据读取器 -
AutoMapper 不需要从数据库加载数据。它旨在执行非常具体、简单的映射。人们一直在尝试将它用于从未打算做的事情,通常会得到更多代码,而不是直接执行转换。这是这样一种情况。您链接到的答案(不是示例)中的代码更长,而不仅仅是为行的内容显式创建一个新对象,而且更容易出错。
-
您可以使用例如 [LINQ to DataTable[(docs.microsoft.com/en-us/dotnet/framework/data/adonet/…) 并通过非常简单的 LINQ 查询获取您的对象,例如
someTable.AsEnumerable().Select(row=>new Contract{ ID=row.Field<int>("ID"), Date=row.Field<DateTime>("Date"),...{) -
因为我没有使用实体框架或dapper,在
GetSales我正在调用其他使用ado.net的项目的数据访问,由于某些原因我什至无法将其重构为最新版本... -
EF Core 和 Dapper 也使用 ADO.NET。 EF 在 ASP.NET 中运行良好,而 Dapper 适用于所有运行时。不管你怎么看,AutoMapper 根本不适合这个。
GetSales()是做什么的,它返回什么,为什么不使用 Dapper 替换该代码?一个简单的connection.Query<ContractListDTO>(sqlQuery);将执行查询并在一次调用中映射结果。
标签: c# asp.net ado.net asp.net-web-api2 automapper