微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

映射两个相同的模型,嵌套有自动映射器

如何解决映射两个相同的模型,嵌套有自动映射器

我做了一些研究,但是找不到我想要的东西。

我有无尽的菜单我有用于该菜单的MenuDTO和Menuviewmodel。我没有在模型和DTO之间进行匹配的问题,但是在将DTO映射到viewmodel时遇到了麻烦。显然我找不到解决方案,您能帮忙吗?

我的MenuDTO对象

    public class MenuDto : BaseDto
    {
        public string Name { get; set; }
        public string Icon { get; set; }
        public string Order { get; set; }
        public string Url { get; set; }
        public bool IsVisible { get; set; }
        public int ParentId { get; set; }
        public MenuDto ParentMenu { get; set; }
        public List<MenuDto> Menus { get; set; }
    }

和Menuviewmodel

    public class Menuviewmodel
    {
        public int Id { get; set; }        
        public bool IsActive { get; set; }
        public string Name { get; set; }
        public string Icon { get; set; }
        public string Order { get; set; }
        public string Url { get; set; }
        public bool IsVisible { get; set; }
        public int ParentId { get; set; }
        public Menuviewmodel ParentMenu { get; set; }
        public List<Menuviewmodel> Menus { get; set; }
    }

这就是我映射MenuDTO和Menuviewmodel对象的方式。

    public class WebProfile : Profile
    {
        public WebProfile()
        {
            CreateMap<MenuDto,Menuviewmodel>();
            CreateMap<Menuviewmodel,MenuDto>();
        }
    }

我在控制器中这样称呼

var navMenuItems = _mapper.Map<List<Menuviewmodel>(_menuService.GetNavMenus());

尽管所有字段都已映射,但在“菜单”字段上却出现错误

我收到的错误消息是;

AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
MenuDto -> Menuviewmodel
BiPortal2020.Business.ServiceDTOs.Menu.MenuDto -> BiPortal2020.WebUI.Areas.Admin.Models.Menu.Menuviewmodel
lambda_method(Closure,MenuDto,Menuviewmodel,ResolutionContext )

AutoMapperMappingException: Error mapping types.

Mapping types:
Object -> List`1
System.Object -> System.Collections.Generic.List`1

解决方法

错误消息表示-AutoMapper无法在MenuDtoMenuViewModel之间进行映射,或者无法找到已定义的映射。

我已经测试了您的映射,它们完全可以。因此,AutoMapper仍然无法找到您的映射。

我假设您在注释部分提到的Business LayerUI Layer是两个单独的项目。由于WebProfile是在UI Layer中定义的,因此您必须告诉AutoMapper它应该搜索该程序集以查找映射。由于您在模型和DTO之间的映射正在工作,因此我猜您已经对BusinessProfile中定义的Business Layer做了同样的事情。

我不知道您现有的代码,但是您可以执行以下操作-在Startup.Configure方法中添加/修改以下行-

services.AddAutoMapper(typeof(IDtoMapping),typeof(IViewModelMapping));

其中IDtoMappingIViewModelMapping分别是在Business LayerUI Layer中声明的两个标记接口(空接口,仅用于标识声明它们的程序集)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。