2016-03-30 3 views
0

Я следую за этот ответ AutoMapper mapping int[] or List<int> from ViewModel to a List<Type> in Domain Model и получил его связывание с моим CategoryId к SelectedCategoryIds на UploadSongViewModel, но я также хочу получить его, чтобы связать SongId с Id на UploadSongViewModel.AutoMapper Mapping навигация вопрос о собственности

namespace App 
{ 
    public static class AutoMapper 
    { 
     public static MapperConfiguration Config; 

     public static void Initialize() 
     { 
      //It works with CategoryId, but throws an error when I include SondId. 
      Config = new MapperConfiguration(x => 
      { 
       x.CreateMap<int, SongCategory>() 
        .IgnoreAllNonExisting() 
        .ForMember(dest => dest.CategoryId, opt => opt.MapFrom(src => src)) 
        .ForMember(dest => dest.SongId, opt => opt.MapFrom(src => src)); //Code that's throwing exception 

       x.CreateMap<UploadSongViewModel, Song>() 
        .IgnoreAllNonExisting() 
        .ForMember(dest => dest.AudioName, opt => opt.MapFrom(src => src.SongName)) 
        .ForMember(dest => dest.AudioPath, opt => opt.MapFrom(src => src.SongPath)) 
        .ForMember(dest => dest.SongCategories, opt => opt.MapFrom(src => src.SelectedCategoryIds)) 
        .ForMember(dest => dest.SongCategories, opt => opt.MapFrom(src => src.Id)); //Code that's throwing exception 
      }); 

      //Throws exception here because it can't bind SongId property 
      Config.AssertConfigurationIsValid(); 
     } 
    } 
} 

public abstract class Entity 
{ 
    public int Id { get; set; } 
} 

public class SongCategory : Entity 
{ 
    public int SongId { get; set; } 
    public int CategoryId { get; set; } 
} 

public class Song : Audio 
{ 
    public string AlbumName { get; set; } 
    public string ArtistName { get; set; } 

    public List<SongCategory> SongCategories { get; set;} 
} 

public class UploadSongViewModel 
{ 
    public int Id { get; set; } 
    public string ArtistName { get; set; } 
    public string AlbumName { get; set; } 
    public int[] SelectedCategoryIds { get; set; } 

    public MultiSelectList CategoriesSelectList { get; set; } 
} 

Я не очень понимаю, что авто код картографа делает из Дарин Димитров ответа, так что трудно отлаживать. Если кто-то может объяснить, как это отображение работает для categoryId и почему он не работает для SongId, это было бы здорово.

Исключение я получаю:

Следующее свойство на System.Collections.Generic.List 1[[SoundVast.Models.SongCategory, SoundVast, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] cannot be mapped: SongCategories Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type System.Collections.Generic.List 1 [[SoundVast.Models.SongCategory, SoundVast, Version = 1.0.0.0, культура = нейтральной, Public- = NULL]]. Контекст: Сопоставление с собственностью SongCategories из System.Int32 в System.Collections.Generic.List`1 [[SoundVast.Models.SongCategory, SoundVast, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] Сопоставление с type SoundVast.Areas.Upload.Models.UploadSongViewModel to SoundVast.Models.Song Исключение типа 'AutoMapper.AutoMapperConfigurationException' было выбрано.

ответ

1

Это может быть легко достигнуто с некоторыми персонализированного сопоставления как только основные правила были применены:

x.CreateMap<int, SongCategory>() 
    .IgnoreAllNonExisting() 
    .ForMember(dest => dest.CategoryId, opt => opt.MapFrom(src => src)); 

x.CreateMap<UploadSongViewModel, Song>() 
    .IgnoreAllNonExisting() 
    .ForMember(dest => dest.AudioName, opt => opt.MapFrom(src => src.SongName)) 
    .ForMember(dest => dest.AudioPath, opt => opt.MapFrom(src => src.SongPath)) 
    .ForMember(dest => dest.SongCategories, opt => opt.MapFrom(src => src.SelectedCategoryIds)) 
    .AfterMap((viewModel, model) => 
    { 
     foreach (var item in model.SongCategories) 
     { 
      item.Id = viewModel.Id; 
     } 
    }); 
Смежные вопросы