Как автоматизировать это (отображение подчиненных членов) - PullRequest
11 голосов
/ 08 февраля 2011

У меня есть что-то вроде этого

public class ProductViewModel
{
  public int SelectedProductId { get; set; }
  public string ProductName {get; set;}
  public int Qty {get; set;}
   public List<SelectListItem> Products { get; set}; 
}

У меня есть такой домен

public class Product
{
  public int ProductId {get; set;}
  public string ProductName {get; set;}
  public int Qty {get; set;}
}


public class Store
{
  public Product() {get; set;}
}

Теперь мне нужно сделать сопоставление.

// в моемКонтроллер

var result = Mapper.Map<ProductViewModel, Store>(Product);

это ничего не связывает, так как он не может понять, как вставить ProductId, так как это

Store.Product.ProductId;

Моя карта похожа на

Mapper.CreateMap<ProductViewModel, Store>().ForMember(dest => dest.Product.ProductId, opt => opt.MapFrom(src => src.SelectedProductId));

Я получаю эту ошибку

Выражение 'dest => Convert (dest.Product.SelectedProductId' должно разрешаться в элемент верхнего уровня. Имя параметра: lambdaExpression

Я не уверен, как это сделать.

Ответы [ 4 ]

25 голосов
/ 16 августа 2011

Чтобы отобразить вложенные структуры, вам просто нужно создать новый объект в аргументе MapFrom .

Пример

Отображение:

Mapper.CreateMap<Source, Destination>()
      .ForMember(d => d.MyNestedType, o => o.MapFrom(t => new NestedType { Id = t.Id }));
Mapper.AssertConfigurationIsValid();

Код теста:

var source = new Source { Id = 5 };
var destination = Mapper.Map<Source, Destination>(source);

Классы:

public class Source
{
    public int Id { get; set; }
}

public class Destination
{
    public NestedType MyNestedType { get; set; }
}

public class NestedType
{
    public int Id { get; set; }
}
2 голосов
/ 14 сентября 2012

Вы можете использовать Resolver.

Создать такой класс резольвера:

class StoreResolver : ValueResolver<Store, int>
{
    protected override int ResolveCore(Store store)
    {
        return store.Product.ProductId;
    }
}

И использовать его так:

Mapper.CreateMap<ProductViewModel, Store>()
        .ForMember(dest => dest.SelectedProductId, opt => opt.ResolveUsing<StoreResolver >());

Надеюсь, это поможет..

1 голос
/ 08 февраля 2011

Ошибка, которую вы получаете, заключается в том, что вы не можете объявить объявления отображения более чем на один уровень в вашем графе объектов.

Поскольку вы разместили только одно свойство, мне сложно дать вам коды, которые сделают эту работу. Один из вариантов - изменить свойство viewmodel на MyTestTestId, и соглашения будут автоматически учитываться.

0 голосов
/ 05 августа 2016

Правильный ответ, данный allrameest на этот вопрос, должен помочь: AutoMapper - Глубокое отображение уровня

Это то, что вам нужно:

Mapper.CreateMap<ProductViewModel, Store>()
    .ForMember(dest => dest.Product, opt => opt.MapFrom(src => src));
Mapper.CreateMap<ProductviewModel, Product>()
    .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.SelectedProductId));

ПРИМЕЧАНИЕ. На этом этапе вам следует отказаться от использования Mapper.CreateMap, он устарел и вскоре не будет поддерживаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...