我正在使用AutoMapper 5.2。我目前有一个映射语句,如下所示:
CreateMap<JeffreysOnline.Data.Customer, JeffreysOnline.Entities.Customer>()
.ForMember(s => s.CustomerWant, t => t.Ignore());
Customer表和Customer实体都有一个名为BadChecks的字段。在数据库中它是一个int。我最近在我的实体中将类型更改为bool。 AutoMapper现在给我以下错误:
Unable to create a map expression from Customer.BadChecks (System.Int16) to Customer.BadChecks (System.Boolean) Mapping types: Customer -> Customer JeffreysOnline.Data.Customer -> JeffreysOnline.Entities.Customer Type Map configuration: Customer -> Customer JeffreysOnline.Data.Customer -> JeffreysOnline.Entities.Customer Property: BadChecks
似乎AutoMapper不知道如何从int映射到布尔值。我可以用这个来帮助AutoMapper吗?
知道在我的DAL中,我正在使用ProjectTo()将IQueryable传递给另一个试图访问数据的方法,因此正在发生映射(生成错误),这可能会有所帮助。我的DAL代码如下所示:
return entityList.OrderBy(row => row.LastName).ProjectTo<Entities.Customer>();
答案 0 :(得分:5)
Automapper 6.0.2 - 无需任何ForMember工作... null,0 = false,值&gt; = 1映射为true。
在Automapper 6.0.2中 - 其他方式:
class nnnProfile : Profile
{
CreateMap<src, dst>()
.ForMember(d => d.Decision, opt => opt.ResolveUsing<CustomBoolResolver>());
}
解析器:
public class CustomBoolResolver : IValueResolver<src, dst, bool>
{
public bool Resolve(src source, dst destination, bool destMember,
ResolutionContext context)
{
return source.Decision == 1;
}
}
但这是每个目的地,所以不太灵活。
根据此页面: http://taswar.zeytinsoft.com/automapper-mapping-objects-part-5-of-7-customresolver/
过去你可以编写一个只包含Source和target类型的自定义解析器。
答案 1 :(得分:2)
我不认为我会知道如何从int映射到布尔值。
如果你弄清楚应该怎么做,你需要创建一个从int到boolean的映射。:
CreateMap<int, bool>().ProjectUsing(src => src != 0);
完全猜测那里。但是,由于您正在使用ProjectTo,因此您需要使用ProjectUsing,以便表达式可以直接进入DAL。
请记住,使用ProjectUsing时,AutoMapper实际上并没有执行映射。它正在创建一个LINQ&#34; Select&#34;它传递给你的查询提供者的表达式(EF可能?)。因此,您需要确保在投影表达式中使用的任何内容,EF都可以支持将其最终转换为SQL。