具有不同特性类型的AutoMapper对象

本文关键字:类型 AutoMapper 对象 | 更新日期: 2023-09-27 18:27:15

我想将我的实体框架实体(从遗留数据库生成)映射到自定义DTO对象(应该很好而且干净)。

我的遗留数据库有一些实体看起来有点像:

internal class Order {
    int id;
    string Shipping_date;
    string quantity;
}

我想把它映射到一个更好的DTO对象:

public class OrderDto {
    int id;
    DateTime? ShippingDate;
    int Quantity;
}

我已经编写了一个"实体容器"来提供依赖注入,它以这种方式返回值:

public IEnumerable<OrderDto> GetPaginatedOrders(int page, int pageSize)
{
    return this.db.Orders
               .OrderByDescending(c => c.id)
               .Paginate(page, pageSize)
               .Project()
               .To<OrderDto>()
               .AsEnumerable();
}

所以:改变类型,改变财产名称。

如果只是更改属性名称,这将是简单但乏味的:

Mapper.CreateMap<Order, OrderDto>()
  .ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.quantity))
  .ForMember(dest => dest.ShippingDate, opt => opt.MapFrom(src => src.Shipping_date));

这对于类型更改是不够的。我试了一大堆东西:

  • 解析映射声明中的属性,如src => int.Parse(src.quantity),但Linq不喜欢
  • 使用自定义属性(如QuantityInt { get { return int.Parse(this.quantity) } })扩展EF实体,并在映射中使用这些属性,但AutoMapper不喜欢它,并且明确不支持它们
  • Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32)一样将系统类型映射到另一个,但我仍然会得到Unable to create a map expression from System.String to System.Int32错误
  • 为我的类使用自定义转换器,但我总是在运行时从实体的ResolutionContext.SourceValues中获得空值(我猜它们是在AutoMapper获得它们之前被释放的,或者类似的东西)

我意识到AutoMapper是基于约定的,所以也许我应该使用另一个工具,但存在哪一个?

谢谢你的帮助!

具有不同特性类型的AutoMapper对象

.Project()使用Linq to实体,它生成SQL,自然只理解非常有限的一组函数。

如果您使用

Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(src) 

你的转换会很好。