Automapper无法将一个枚举类型投射到另一个枚举类型

时间:2014-09-17 17:22:15

标签: linq automapper

我正在利用Automapper和Entity Framework中的Project功能,但我遇到的问题是Automapper似乎并不想将一个枚举类型投射到另一个。

我有以下实体:

public class UserProfile
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    private HashSet<UserProfilePhone> m_Phones;
    public virtual HashSet<UserProfilePhone> Phones
    {
        get { return m_Phones ?? (m_Phones = new HashSet<UserProfilePhone>()); }
        set { this.m_Phones = value; }
    }
}

public class UserProfilePhone
{
    public PhoneType Type { get; set; }
    public virtual string Number { get; set; }
}

public enum PhoneType
{
    Home = 1,
    Work = 2,
    Mobile = 3,
    Other = 4
}

然后我将这些类型投射到以下模型中:

public class UserProfileModel
{
    public Guid Id { get; set; }
    public virtual string Name { get; set; }
    public IEnumerable<UserProfilePhoneModel> Phones { get; set; }
}

public class UserProfilePhoneModel
{
    public UserProfilePhoneTypeModel Type { get; set; }
    public string Number { get; set; }        
}

public enum UserProfilePhoneTypeModel
{
    Home = 1,
    Work = 2,
    Mobile = 3,
    Other = 4
}
然后我按照这样设置我的映射:

Mapper.CreateMap<PhoneType, UserProfilePhoneTypeModel>();
Mapper.CreateMap<UserProfilePhone, UserProfilePhoneModel>();
Mapper.CreateMap<UserProfile, UserProfileModel>();

最后,我正在执行我的预测:

var result = dbContext.UserProfiles.Project().To<UserProfileModel>();

当我这样做时,我得到以下异常:

  

AutoMapper.AutoMapperMappingException:无法从MyNamespace.PhoneType创建地图表达式   MyNamespace.Models.UserProfilePhoneTypeModel       无法从MyNamespace.PhoneType到MyNamespace.Models.UserProfilePhoneTypeModel创建地图表达式       结果StackTrace:
      在System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory)       ...

我尝试过创建显式映射,但它们似乎被忽略了。我在这里做错了什么?

1 个答案:

答案 0 :(得分:12)

像往常一样,我几乎在发布问题时就找到了答案。

修改创建地图行以提供显式强制转换功能:

Mapper.CreateMap<UserProfilePhone, UserProfilePhoneModel>()
    .ForMember(m => m.Type, opt => opt.MapFrom(t => (UserProfilePhoneTypeModel)t.Type));