我有 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
您可以对映射配置进行一些自定义,创建映射配置文件如下:
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