Automapper投掷奇数映射错误

时间:2013-11-18 11:21:48

标签: automapper .net-4.5

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<>的投影功能,我需要做些什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:6)

只是花了一些时间在AutoMapper来源解决这个问题。问题来自类型处理中的错误,但在自动化源代码中并不容易解决。

TL; DR:如果您将AdminUserProfile.Roles设为IEnumerable<string>类型,我认为它会起作用。

.ForMember(vm => vm.Roles, opt => opt.MapFrom(m => m.Roles.Select(r => r.Name)))

我打赌AdminUserProfile.Rolesstring[]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>