映射两个相同的模型,嵌套在自动映射器中
Map two identical models, nested with automapper
我做了一些研究,但找不到我想要的东西。
我有无穷无尽的菜单。我有一个 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>();
}
}
我在controller中这样调用
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,要么无法在 MenuDto
和 MenuViewModel
之间映射,要么无法找到定义的映射。
我已经测试了你的映射,它们完全没问题。因此,还有一种可能性是 AutoMapper 无法找到您的映射。
我假设您在评论部分提到的 Business Layer
和 UI Layer
是两个独立的项目。由于 WebProfile
是在 UI Layer
中定义的,您必须告诉 AutoMapper 它应该搜索该程序集以找到映射。由于您的模型和 DTO 之间的映射正在运行,我猜您已经为 Business Layer
.
中定义的 BusinessProfile
做了同样的事情
我不知道你现有的代码,但你可以这样做 - 在 Startup.Configure
方法中 add/modify 以下行 -
services.AddAutoMapper(typeof(IDtoMapping), typeof(IViewModelMapping));
其中IDtoMapping
和IViewModelMapping
是在Business Layer
和UI Layer
中声明的两个标记接口(空接口,仅用于标识声明它们的程序集) , 分别.
我做了一些研究,但找不到我想要的东西。
我有无穷无尽的菜单。我有一个 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>();
}
}
我在controller中这样调用
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,要么无法在 MenuDto
和 MenuViewModel
之间映射,要么无法找到定义的映射。
我已经测试了你的映射,它们完全没问题。因此,还有一种可能性是 AutoMapper 无法找到您的映射。
我假设您在评论部分提到的 Business Layer
和 UI Layer
是两个独立的项目。由于 WebProfile
是在 UI Layer
中定义的,您必须告诉 AutoMapper 它应该搜索该程序集以找到映射。由于您的模型和 DTO 之间的映射正在运行,我猜您已经为 Business Layer
.
BusinessProfile
做了同样的事情
我不知道你现有的代码,但你可以这样做 - 在 Startup.Configure
方法中 add/modify 以下行 -
services.AddAutoMapper(typeof(IDtoMapping), typeof(IViewModelMapping));
其中IDtoMapping
和IViewModelMapping
是在Business Layer
和UI Layer
中声明的两个标记接口(空接口,仅用于标识声明它们的程序集) , 分别.