1

Я застрял, пытаясь сопоставить класс ViewModel с помощью Automapper с классами, перечисленных ниже:Карта EditModel использования Automapper

public class Product 
{ 
    [Key] 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
    public ICollection<Color> Color { get; set; } 
} 

public class Color 
{ 
    [Key] 
    public int id { get; set; } 
    public string value { get; set; } 

    public virtual ICollection<Product> products { get; set; } 
} 

public class ProductVM 
{ 
    [Key] 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
    public List<int> Color { get; set; } 
    public IEnumerable<Color> Colors { get; set; } 
} 

С цветами я прохожу все доступные цвета к просмотру для пользователей, чтобы выбрать, и свойство цвета в получить значение, имеющее что-то вроде этого в поле зрения:

@Html.ListBoxFor(model => Model.Color, new MultiSelectList(Model.Colors, "id", "value")); 

Тогда в contorller у меня есть метод Post, которая сохраняет его. Я попытался использовать Automapper для преобразования классов, но он не смог отобразить свойство Color, поскольку он должен получить объект Color по доступному id.

Mapper.CreateMap<ProductVM, Product>(); 
Product product = AutoMapper.Mapper.Map<ProductVM, Product>(productVM); 
db.Products.Add(product); 
db.SaveChanges(); 

Я пропустил что-то?

ответ

1

Я пробовал что-то в своем решении, цвета будут пустыми, так как selectlist не возвращается из представления. Ваш список int (color) не будет null, и вы можете сопоставить его с цветовым объектом.

var productVM = new ProductVM 
{ 
    Name = "Test", 
    ProductId = 5, 
    Colors = null, 
    Color = new List<int> {1, 5, 8} 
}; 

Mapper.CreateMap<int, Color>() 
    .ForMember(dest => dest.id, opt => opt.MapFrom(src => src)); 

Mapper.CreateMap<ProductVM, Product>() 
    .ForMember(dest => dest.Color, opt => opt.MapFrom(src => src.Color)); 

Product product = AutoMapper.Mapper.Map<ProductVM, Product>(productVM); 
db.Products.Add(product); 
db.SaveChanges(); 
+0

Помогло ли это решение для вас? –

+0

Это почти работает так, как должно, но каким-то образом я получаю новые дополнительные записи в таблице цветов, то есть, если я передаю 2 идентификатора цвета, я получаю 2 новых цвета (значения которых равны нулю) и связанный с ними продукт, но не с оригинальными. – hitry

+0

Я только что прочитал ваш комментарий, получили ли вы также объекты Color? –

0

Это происходит потому, что Automapper не знает, как отобразить из списка < int> Цвет для ICollection < Цвет> Цвета. Попробуйте создать карту для этого.

Mapper.CreateMap<SourceObject, TargetObject>(); 
Mapper.CreateMap<SourceOuterObject, TargetOuterObject>() 
    .ForMember(dest => dest.TargetList, opt => opt.MapFrom(src => src.SourceSet.SourceList); 
+0

Это необходимо будет карта из 'Список Color' к' ICollection Color' ('IEnumerable Colors' будет пустой список в методе POST) –

+0

Согласен. Я не был уверен, хотя, как, почему вы хотите сопоставить int с цветным объектом? ... Не уверен, что это была опечатка. надеюсь, OP поймет, что я предлагаю – sarin

+0

OP необходимо сопоставить 'List ' to 'ICollection Color', потому что свойство' Color' является свойством, которым привязан ListBox, и будет содержать коллекцию цветов 'ID' в методе POST –

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