首页 > 解决方案 > 我无法从与我的 ViewModel 的多对多关系中检索数据

问题描述

我有一个与多对多关系中的Map表相关的表。Day因此,我MapDay根据 EF 文档创建了该表。

从多到多不相关的表,我返回没有问题......

这是我的控制器,我正在使用视图模型......

[HttpGet("getmaps")]
public async Task<ActionResult<IEnumerable<MapViewModel>>> GetMap()
{
    var maps = _mapper.Map<IEnumerable<MapViewModel>>(await _mapRepository.GetMaps());
    if(maps.Count() > 0) return Ok(maps);

    return NotFound();
}

这是我的 MapViewModel:

public class MapViewModel : MainViewModel
{

    public Guid UserId { get; set; }
    public double Lng { get; set; }
    public double Lat { get; set; }
    public AddressViewModel Address { get; set; }        

    /* EF Relations */
    public ItemMapViewModel ItemMap { get; set; }
    public IEnumerable<MapDayViewModel> MapDay { get; set; } //testing
    public IEnumerable<DayViewModel> Day { get; set; } // need this?
    
}

我的存储库带有查询:

public async Task<IEnumerable<Map>> GetMaps()
{

    return await Db.Maps.AsNoTracking()
        .Include(i => i.Address)
        .Include(it => it.ItemMap)
        .Include(mp => mp.MapDay).ThenInclude(mp => mp.Day)
        .ToListAsync();
}

这是我的结果 JSON:

[
    {
        "userId": "705cbdaf-86e9-4759-8f85-4fa6f3560726",
        "lng": 0.0,
        "lat": 0.0,
        "address": {
            "street": "st 123",
            "number": "12",
            "apt": "34",
            "area": "AreaT",
            "zip": "123456789",
            "city": "Belo ",
            "state": "ST",
            "id": "ba3e7a68-63eb-4383-b980-14dea9615072"
        },
        "itemMap": {
            "id": "353ccb80-b9fd-4469-9270-6a399ad37201",
            "item": "Item1"
        },
        "mapDay": [
            {
                "mapId": "719da65c-42c9-4954-a750-e0b90e82461e",
                "dayId": "5b444e8e-642f-4175-9329-9ef4a0f7aa87"
            }
        ],
        "day": null,
        "id": "719da65c-42c9-4954-a750-e0b90e82461e"
    }
]

使用aspnet core 3.1 那么,我该怎么做才能返回这张地图的天数呢?

标签: entity-frameworkasp.net-core

解决方案


使用aspnet core 3.1 那么,我该怎么做才能返回这张地图的天数呢?

如果要Day在 type 的返回结果中包含数据IEnumerable<MapViewModel>,确实需要public IEnumerable<DayViewModel> Day {get; set;}添加MapViewModel.

由于您没有提供您的自动映射器代码,我将根据您提供的代码完成您的要求。

这里我将你的模型简化如下:</p>

楷模:

public class Map
{
    public int MapId { get; set; }
    public string MapName { get; set; }
    public ICollection<MapDay> MapDay { get; set; }
}  
public class Day
{
    public int DayId { get; set; }
    public string DayName { get; set; }
    public ICollection<MapDay> MapDay { get; set; }
}
public class MapDay
{
    public int MapId { get; set; }
    public Map Map { get; set; }
    public int DayId { get; set; }
    public Day Day { get; set; }
}

视图模型:

    public class MapViewModel
    {
        public int MapId { get; set; }
        public string MapName { get; set; }
        public IEnumerable<MapDayViewModel> MapDay { get; set; } //testing
        public IEnumerable<DayViewModel> Day { get; set; } // need this? 
    }
    
    public class DayViewModel
    {
        public int DayId { get; set; }
        public string DayName { get; set; }
    }

    public class MapDayViewModel
    {
        public int MapId { get; set; }
        public int DayId { get; set; }
    }

这是将数据从模型转换为视图模型的详细 Automapper 代码:

        [HttpGet("getmaps")]
        public async Task<ActionResult<IEnumerable<MapViewModel>>> GetMap()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Map, MapViewModel>()
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(s => s.MapId))
                .ForMember(dest => dest.MapName, opt => opt.MapFrom(s => s.MapName))
                .ForMember(x => x.MapDay, opt => opt.MapFrom(model => model.MapDay))
                .ForMember(x => x.Day, opt => opt.MapFrom(model => model.MapDay.Select(x => x.Day)));
                
                 cfg.CreateMap<MapDay, MapDayViewModel>()
                 .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.MapId))
                 .ForMember(dest => dest.DayId, opt => opt.MapFrom(src => src.DayId));

                 cfg.CreateMap<Day, DayViewModel>()
                 .ForMember(dest => dest.DayId, opt => opt.MapFrom(src => src.DayId))
                 .ForMember(dest => dest.DayName, opt => opt.MapFrom(src => src.DayName));
            });

            IMapper _mapper = config.CreateMapper();
            var maps = _mapper.Map<IEnumerable<MapViewModel>>(await _mapRepository.GetMaps());
            if (maps.Count() > 0)
                return Ok(maps);

            return NotFound();
        }

这是测试结果:

在此处输入图像描述


推荐阅读