Карта EditModel с использованием Automapper

Я застрял, пытаясь сопоставить класс ViewModel с помощью 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; } 
}

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

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

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

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

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

2 ответа

Решение

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

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();

Это происходит потому, что Automapper не знает, как сопоставить цвета List Color с ICollection. Попробуйте создать карту для этого тоже.

Mapper.CreateMap<SourceObject, TargetObject>();
Mapper.CreateMap<SourceOuterObject, TargetOuterObject>()
    .ForMember(dest => dest.TargetList, opt => opt.MapFrom(src => src.SourceSet.SourceList);
Другие вопросы по тегам