2012-03-06 2 views
2

Что такое лучший/простой способ настроить AutoMapper на карту ICollection<DomainModel> к ICollection<ViewModel>ICollection<object> к?Карта от ICollection <EFEntity> к ICollection <ViewModel> к ICollection <Object> с AutoMapper

У меня есть DomainModel, который выглядит следующим образом:

public class DomainModel 
{ 
    ICollection<EFEntity> Data; 

    //other stuff 
} 

Я хочу отобразить эту DomainModel к MVC ViewModel:

public class ViewModelWithCollection 
{ 
    ICollection<object> Data; 

    //other stuff 
} 

Мне нужно ICollection<object>, потому что я использую следующий вид:

@model ViewModelWithCollection 
<table> 
    @foreach(object x in Model.Data) 
    { 
     Html.Partial("PartialView", x) 
    } 
</table> 

Для каждой конкретной модели ViewModel существует PartialView:

@model ViewModel 
<tr> <!-- Render specific View Data --> <tr> 

Когда я использую

AutoMapper.Map<DomainModel, ViewModelWithCollection>(source, target); 

AutoMapper просто делает что-то вроде этого:

object target = (object)EFEntity 

, который, конечно, не будет работать.

ответ

3

После нескольких часов поисков я обнаружил, что вещь, которую я хочу достичь, называется Mapping Наследование: https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance

Так что решение моей проблемы

AutoMapper.Map<DomainModel, ViewModelWithCollection>(); 

AutoMapper.Map<EFEntity, object>() 
    .Include<EFEntity, ViewModel>(); 

AutoMapper.Map<EFEntity, ViewModel>(); 
1

Я имел то, что, как представляется, та же проблема.

У меня был модель предметной области:

public class Client 
{ 
public int ClientId { get; set; } 
public virtual ICollection<Contract> Contracts { get; set; } 
} 

И мой взгляд, модель:

public class ClientProfileViewModel 
{ 
public int ClientId { get; set; } 
public IEnumerable<ContractProfileViewModel> Contracts { get; set; } 
} 

Тогда в моем Отображении:

Mapper.CreateMap<Client, ClientProfileViewModel>() 
     .ForMember(c => c.Contracts, options => options.MapFrom(c => c.Contracts)); 

Mapper.CreateMap<ClientProfileViewModel, Client>() 
     .ForMember(c => c.Contracts, options => options.MapFrom(c => c.Contracts)) 
+0

ли 'свойство' ICollection ' Модель домена клиента не имеет своего имени (** Контракты ** возможно?) В вашем примере кода? – Theophilus

+0

Хорошее место, я исправил это сейчас. Это не было частью проблемы, просто опечатка с моей стороны при написании выше. – JBeagle

Смежные вопросы