2014-09-17 7 views
8

Sto sfruttando le funzionalità di Project in Automapper ed Entity Framework, ma sto riscontrando un problema in cui Automapper non sembra voler proiettare un tipo di enum su un altro.Automapper non è in grado di proiettare un tipo enum su un altro

ho le seguenti entità:

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 
} 

Ho quindi sto proiettando questi tipi per i seguenti modelli:

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 
} 

Ho poi installato il mio mappature in questo modo:

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

E infine sto eseguendo la mia proiezione:

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

Quando faccio questo, ottengo la seguente eccezione:

AutoMapper.AutoMapperMappingException: Impossibile creare un'espressione mappa da MyNamespace.PhoneType a MyNamespace.Models.UserProfilePhoneTypeModel Impossibile creare una mappa espressione da MyNamespace.PhoneType a MyNamespace.Models.UserProfilePhoneTypeModel StackTrace Risultato:
a System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory) ...

Ho provato a creare associazioni esplicite, ma sembrano essere ignorate. Cosa sto facendo di sbagliato qui?

+0

possibile duplicato del [Automapper enum di enumerazione di classe] (http://stackoverflow.com/questions/24453398/automapper-enum -a-enumeration-class) –

risposta

10

Come al solito, ho capito la risposta quasi non appena ho postato la domanda.

Modifica della linea di mappa creare per fornire un cast esplicito ha fatto il trucco:

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

Il mapping funziona senza proiezione, ma fallisce quando si tenta di proiettare un enum su un altro. È un bug di Automapper? – vk5880

+0

Sicuramente sembra un insetto. – RMD