Карта из ICollection <EFEntity>в ICollection <ViewModel>в ICollection <Object>с помощью AutoMapper - PullRequest
3 голосов
/ 07 марта 2012

Каков наилучший / самый простой способ настроить AutoMapper для сопоставления ICollection<DomainModel> с ICollection<ViewModel> на ICollection<object>?

У меня есть 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

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

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

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

Итак, решение моей проблемы -

AutoMapper.Map<DomainModel, ViewModelWithCollection>();

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

AutoMapper.Map<EFEntity, ViewModel>();
2 голосов
/ 10 июля 2013

У меня была такая же проблема.

У меня была модель моего домена:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...