我正在利用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.ConcurrentDictionary2.GetOrAdd(TKey key, Func
2 valueFactory) ...
我尝试过创建显式映射,但它们似乎被忽略了。我在这里做错了什么?
答案 0 :(得分:12)
像往常一样,我几乎在发布问题时就找到了答案。
修改创建地图行以提供显式强制转换功能:
Mapper.CreateMap<UserProfilePhone, UserProfilePhoneModel>()
.ForMember(m => m.Type, opt => opt.MapFrom(t => (UserProfilePhoneTypeModel)t.Type));