我想将我的实体框架实体(从遗留数据库生成)映射到自定义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)但我仍然无法创建从System.String到System.Int32错误的映射表达式.
>为我的类使用自定义转换器,但我总是从我的实体运行时从ResolutionContext.SourceValues中获取空值(我猜测它们在AutoMapper获取它们之前处理它们或类似的东西).
我意识到AutoMapper是基于会议的,所以也许我应该使用另一个工具,但哪一个存在?
谢谢你的帮助!
最佳答案 .Project()使用Linq实体,它生成SQL并且自然只能理解一组非常有限的函数.
如果你使用
Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(src)
你的转换会很好.