Automapper向我抛出此错误:Missing map from String to String. Create using Mapper.CreateMap<String, String>.
地图用于两个地方。在一个地方它运作良好,在另一个地方它失败。
映射配置文件是:
public class AdminUserProfileProfile: Profile
{
protected override void Configure()
{
Mapper.CreateMap<AdminUser, AdminUserProfile>()
.ForMember(vm => vm.Id, opt => opt.MapFrom(m => m.Id))
.ForMember(vm => vm.Name, opt => opt.MapFrom(m => m.Name))
.ForMember(vm => vm.Email, opt => opt.MapFrom(m => m.Email))
.ForMember(vm => vm.Roles, opt => opt.MapFrom(m => m.Roles.Select(r => r.Name)))
.IgnoreAllNonExisting();
}
}
用例的唯一区别在于,行为符合预期的映射使用Mapper.Map<AdminUserProfile>(entity)
,失败的映射使用`Project()。来'调用。
我想使用Project().To<>
的投影功能,我需要做些什么才能让它发挥作用?
答案 0 :(得分:6)
只是花了一些时间在AutoMapper
来源解决这个问题。问题来自类型处理中的错误,但在自动化源代码中并不容易解决。
TL; DR:如果您将AdminUserProfile.Roles
设为IEnumerable<string>
类型,我认为它会起作用。
.ForMember(vm => vm.Roles, opt => opt.MapFrom(m => m.Roles.Select(r => r.Name)))
我打赌AdminUserProfile.Roles
,string[]
或ICollection<string>
就是List<string>
。
AutoMapper正在尝试组合看起来像这样的linq查询:
admins.Select(a => new AdminUserProfile{
Id = a.Id,
Name = a.Name,
Roles = a.Roles.Select(r => r.Name)
})
但这不合法,因为Roles = a.Roles.Select(r => r.Name)
上的类型不匹配。在我的情况下,我的Roles
属性为ICollection<string>
,但a.Roles.Select
正在返回IEnumerable<string>
,您无法直接分配这些属性。
我修补了自动播放源以解决Missing map from String to String.
错误,过了一次,它会尝试在其中添加ToList
,生成如下内容:
admins.Select(a => new AdminUserProfile{
Id = a.Id,
Name = a.Name,
Roles = a.Roles.Select(r => r.Name).ToList()
})
这很简洁,但是如果你将它与Linq-to-entities一起使用,你将会遇到运行时LINQ to Entities does not recognize the method ToList
错误。
我认为&#34;真实&#34;修复将对automapper进行重大更改,并使其生成如下内容:
admins.Select(a => new {
a.Id,
a.Name,
Roles = a.Roles.Select(r => r.Name)
})
.AsEnumerable() // run the linq-to-entities query
.Select(a => new AdminUserProfile{
Id = a.Id,
Name = a.Name,
Roles = a.Roles.ToList()
})
代码非常密集,因此我不太可能做出此修复。
我建议您只需将AdminUserProfile.Roles
更改为IEnumerable<string>
。