如何使用 Automapper 将 ViewModel 中的 List<string> 映射到另一个实体中的字符串?

问题描述 投票:0回答:1

我有 4 个实体:

public class Game
    {
        public int Id { get; set; }
        public string GameName { get; set; }
        public int DeveloperStudioId { get; set; }
        public DeveloperStudio DeveloperStudio { get; set; }
        public ICollection<GameGenre> GameGenres { get; set; }
    }
public class DeveloperStudio
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
public class Genre
    {
        public int GenreId { get; set; }
        public string GenreName { get; set; }
        public ICollection<GameGenre> GameGenres { get; set; }
    }
public class GameGenre
    {
        public int GameId { get; set; }
        public Game Game { get; set; }
        public int GenreId { get; set; }
        public Genre Genre { get; set; }
    }

和 1 个视图模型:

public class GameVM
    {
        public string GameName { get; set; }
        public string DeveloperStudioName { get; set; }
        public HashSet<string> Genres { get; set; }
    }

而且无论我做什么,我都无法使用 Automapper 将 GameVM 中的 List 映射到 Genre 实体中的 GenreName。我想将 HashSet Genres 中的每个字符串映射到 Game 实体中 ICollection GameGenres 中的每个 GenreName。像这样的东西:

CreateMap<GameVM, Game>()
.ForMember(dest=>dest.GameGenres.Select(s=>s.Genre.GenreName), opt=>opt.MapFrom(g=>g.Genres))

它需要工作=D

c# asp.net many-to-many automapper
1个回答
0
投票

您可以对映射配置进行一些自定义,创建映射配置文件如下:

public class GameProfile : Profile
    {
        public GameProfile()
        {
            CreateMap<GameVM, Game>()
                .ForMember(dest => dest.GameGenres, opt => opt.MapFrom(src =>
                    src.Genres.Select(genreName => new GameGenre { Genre = new Genre { GenreName = genreName } }).ToList()))
                .ForMember(dest => dest.DeveloperStudio, opt => opt.MapFrom(src =>
                    new DeveloperStudio { Name = src.DeveloperStudioName }));
            //CreateMap<GameVM, Game>().ForMember(dest => dest.GameGenres.Select(s => s.Genre.GenreName), opt => opt.MapFrom(g => g.Genres));           
        }
    }

在此配置中,我们创建了 GameVM 和 Game 之间的映射,并指定应使用自定义函数映射 GameGenres 属性。自定义函数使用 LINQ 为源对象的 Genres 属性中的每个流派名称选择一个新的 GameGenre 对象。每个新的 GameGenre 对象都使用一个新的 Genre 对象进行初始化,该对象的 GenreName 属性设置为相应的流派名称。最后,将 GameGenre 对象列表分配给目标对象的 GameGenres 属性。 我们还将源对象的 DeveloperStudioName 属性映射到一个新的 DeveloperStudio 对象,并将其 Name 属性设置为相同的值。 然后你可以在注入后使用这个映射器:

var gameVM = new GameVM
            {
                GameName = "My Game",
                DeveloperStudioName = "My Studio",
                Genres = new HashSet<string> { "Action", "Adventure", "Others" }
            };

            var game = mapper.Map<Game>(gameVM);
            Console.WriteLine($"-------------------------------------");
            foreach (var item in game.GameGenres)
            {
                Console.WriteLine($"GenerName: {item.Genre.GenreName}");
            }

输出将是:

-----------------------------------------
GenerName: Action
GenerName: Adventure
GenerName: Others
© www.soinside.com 2019 - 2024. All rights reserved.