首页 > 解决方案 > Automapper - 如何在深层应用 ForMember 配置

问题描述

我正在尝试学习 asp.NetCore 2.2。我正在尝试设置一个简单的单页网站。我遇到了 Automapper 的问题,其中使用 forMember() 的手动映射在顶层工作CreateMap<Listing, ListingSearchResultsDto>().ForMember(ListingPhotosUrl)但不在较低级别。我有另一个映射CreateMap<User, UserDetailsDto>(),其中user包含一个Mylistings类型的对象ListingMylistings已正确自动映射到,ListingSearchResultsDto但未应用手动配置CreateMap<Listing, ListingSearchResultsDto>().ForMember(ListingPhotosUrl)

我试过CreateMap<User, UserDetailsDto>().Formember(dest.Mylistings.ListingPhotosUrl,src.Mylistings.Photos.Url)了,但似乎不可能。

我也试过这个->但没有运气

            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<User, UserDetailsDto>();
                cfg.CreateMap<Listing, ListingSearchResultsDto>()
                .ForMember(dest => dest.ListingPhotosUrl, opt =>
            {
                opt.MapFrom(src => src.Photos.FirstOrDefault(p => p.IsMain).Url);
            });

            });

            var mapper = config.CreateMapper();

编码:

AutoMappperProfiles

 public AutoMapperProfiles()
        {
            CreateMap<Listing, ListingSearchResultsDto>()
            .ForMember(dest => dest.ListingPhotosUrl, opt =>
            {
                opt.MapFrom(src => src.Photos.FirstOrDefault(p => p.IsMain).Url);
            });           


            CreateMap<User, UserDetailsDto>();

            CreateMap<ListingPhoto, ListingPhotosDetailedDto>();
        }

用户

    public class User
    {
        public int Id { get; set; }
        public string Username { get; set; }

        public ICollection<Listing> MyListings { get; set; }
    }

用户详情Dto

public class UserDetailsDto
    {
        public int Id { get; set; }
        public string Username { get; set; }

        public ICollection<ListingSearchResultsDto> MyListings { get; set;}
     }

清单

        public int id { get; set; }
        public string Category { get; set; }
        public string Title { get; set; }

        public ICollection<ListingPhoto> Photos { get; set; }

列表搜索结果Dto

    public class ListingSearchResultsDto
    {
        public int id { get; set; }
        public string Title { get; set; }
        public string ListingPhotosUrl { get; set; }                    
    }

我正在使用CreateMap<Listing, ListingSearchResultsDto>().Formember(des,src)手动映射目标属性ListingPhotosUrl。我有另一个映射CreateMap<User, UserDetailsDto>()。在User&UsedetailsDto类中,我有一个分别称为MyListings类型ICollection<Listing>和的对象ICollection<ListingSearchResultsDto>MyListings对象已正确自动映射,但未ListingPhotosUrl应用手动映射。CreateMap<Listing,ListingSearchResultsDto>.Formember(des,src))手动映射在顶层工作,但不是在更深层次的内部CreateMap<User, UserDetailsDto>(),有没有办法解决这个问题?谢谢

标签: c#modelautomapperviewmodelobject-object-mapping

解决方案


已修复 - Automapper 工作正常。实体框架 DbContext 中的问题。我没有将照片作为相关数据包含在 EF Core 加载 USER 数据的方法中GETUSER()。它正在使用 EF Core 方法来加载 LISTING GetListing(),因为我有一个包含照片Include(p => p.Photos)

添加.ThenInclude(p => p.Photos)GetUser(),照片返回了用户数据,自动映射器成功映射了用户数据,ListingPhotosUrl手动映射成功应用。

实体框架核心 DbContext:

public async Task<User> GetUser(int id)
{
    var user = await _context.Users
        .Include(a => a.Avatar)
        .Include(l => l.MyListings)
            .ThenInclude(p => p.Photos)
                .FirstOrDefaultAsync(u => u.Id == id);

    return user;
}

public async Task<Listing> GetListing(int id)
{
    var listing = await _context.Listings
        .Include(p => p.Photos)
        .FirstOrDefaultAsync(l => l.id == id);

    return listing;
}

推荐阅读