AutoMapper映射导航属性问题



我遵循这个答案AutoMapper mapping int[]或List<int>从ViewModel到列表<类型>在域模型中,并已使其与UploadSongViewModel上的CategoryIdSelectedCategoryIds绑定,但我也想使其在UploadSongViewModel上与SongIdId绑定。

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; }
}

我真的不明白Darin Dimitrov的答案中的自动映射程序代码在做什么,所以很难调试。如果有人能解释这个映射如何适用于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,Culture=neutral,PublicKeyToken=null]]。上下文:映射到属性SongCategories从System.Int32到System.Collections.Generic.List`1[[SoundVast.Models.SongCategory,SoundVast,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]从类型SoundVast.Areaas.Upload.Models.UploadSongViewModel映射到SoundVas.Models.Song引发了类型为"AutoMapper.AutoMapperConfigurationException"的异常。

一旦应用了基本规则,就可以通过一些自定义映射轻松实现:

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

相关内容

最新更新