不支持使用 AutoMapper 映射 .NET 5
Unsupported Mapping .NET 5 using AutoMapper
我有一个配置文件映射文件。
public class AutoMapperProfiles : Profile
{
public AutoMapperProfiles()
{
#region MyFunObjects
CreateMap<CreateMyFunObjectDto, MyFunObject>();
CreateMap<MyFunObject, MyFunObjectDetailDto>();
#endregion
}
}
MyFunObject
型号简单:
public class MyFunObject
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
我的 dto 很简单:
public class CreateMyFunObjectDto
{
[Required]
public string Name { get; set; }
}
public class MyFunObjectDetailDto
{
public int Id { get; set; }
public string Name { get; set; }
}
Automapper 已在 Startup.cs
的 ConfigureServices
中注册
services.AddAutoMapper(typeof(Startup));
在我的服务中,这一行中断并抛出未处理的错误“Unsupported Mappings”。
MyFunObject myFunObject = _mapper.Map<CreateMyFunObjectDto, MyFunObject >(createMyFunObjectDto);
这在另一个方法调用中也失败了。
return _mapper.Map<List<MyFunObjectDetailDto>>(myFunObjectList);
我错过了什么?
堆栈跟踪:
blazor.server.js:19 [2021-01-30T15:26:00.306Z] Error: AutoMapper.AutoMapperMappingException: Error mapping types.
Mapping types:
Object -> List`1
System.Object -> System.Collections.Generic.List`1[[Ruak_Models.DTOs.StatusDtos.StatusDetailDto, Ruak_Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.
Mapping types:
Status -> StatusDetailDto
Ruak_Data.Models.Status -> Ruak_Models.DTOs.StatusDtos.StatusDetailDto
at lambda_method90(Closure , Status , StatusDetailDto , ResolutionContext )
at lambda_method89(Closure , Object , List`1 , ResolutionContext )
--- End of inner exception stack trace ---
at lambda_method89(Closure , Object , List`1 , ResolutionContext )
at Ruak_Business.Services.StatusService.StatusService.GetStatuses() in C:\Code\BlazorRuak\RuakBlazor\Ruak\Ruak_Business\Services\StatusService\StatusService.cs:line 53
at Ruak_Server.Pages.Objectives.ObjectiveList.OnInitializedAsync() in C:\Code\BlazorRuak\RuakBlazor\Ruak\Ruak_Server\Pages\Objectives\ObjectiveList.razor.cs:line 28
at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)
AutoMapper
在 AutoMapperProfiles
class 中找不到您有 defined/configured 的地图。最可能的原因是配置文件 class 与包含 Startup
class.
的程序集位于不同的程序集中
如果是这种情况,那么您可以在包含 AutoMapperProfiles
class -
的程序集中创建一个标记界面
public interface IMappingProfile
{
//
}
它的唯一目的是 mark/identify 包含您的地图的程序集。
然后注册AutoMapper
为-
services.AddAutoMapper(typeof(IMappingProfile));
编辑:
使用标记界面只是我个人的喜好,因为我倾向于为我的域模型创建单独的配置文件 classes。因此,您可以简单地省略界面并使用您的个人资料 class 类型进行注册,类型为 -
services.AddAutoMapper(typeof(AutoMapperProfiles));
我有一个配置文件映射文件。
public class AutoMapperProfiles : Profile
{
public AutoMapperProfiles()
{
#region MyFunObjects
CreateMap<CreateMyFunObjectDto, MyFunObject>();
CreateMap<MyFunObject, MyFunObjectDetailDto>();
#endregion
}
}
MyFunObject
型号简单:
public class MyFunObject
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
我的 dto 很简单:
public class CreateMyFunObjectDto
{
[Required]
public string Name { get; set; }
}
public class MyFunObjectDetailDto
{
public int Id { get; set; }
public string Name { get; set; }
}
Automapper 已在 Startup.cs
ConfigureServices
中注册
services.AddAutoMapper(typeof(Startup));
在我的服务中,这一行中断并抛出未处理的错误“Unsupported Mappings”。
MyFunObject myFunObject = _mapper.Map<CreateMyFunObjectDto, MyFunObject >(createMyFunObjectDto);
这在另一个方法调用中也失败了。
return _mapper.Map<List<MyFunObjectDetailDto>>(myFunObjectList);
我错过了什么?
堆栈跟踪:
blazor.server.js:19 [2021-01-30T15:26:00.306Z] Error: AutoMapper.AutoMapperMappingException: Error mapping types.
Mapping types:
Object -> List`1
System.Object -> System.Collections.Generic.List`1[[Ruak_Models.DTOs.StatusDtos.StatusDetailDto, Ruak_Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.
Mapping types:
Status -> StatusDetailDto
Ruak_Data.Models.Status -> Ruak_Models.DTOs.StatusDtos.StatusDetailDto
at lambda_method90(Closure , Status , StatusDetailDto , ResolutionContext )
at lambda_method89(Closure , Object , List`1 , ResolutionContext )
--- End of inner exception stack trace ---
at lambda_method89(Closure , Object , List`1 , ResolutionContext )
at Ruak_Business.Services.StatusService.StatusService.GetStatuses() in C:\Code\BlazorRuak\RuakBlazor\Ruak\Ruak_Business\Services\StatusService\StatusService.cs:line 53
at Ruak_Server.Pages.Objectives.ObjectiveList.OnInitializedAsync() in C:\Code\BlazorRuak\RuakBlazor\Ruak\Ruak_Server\Pages\Objectives\ObjectiveList.razor.cs:line 28
at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)
AutoMapper
在 AutoMapperProfiles
class 中找不到您有 defined/configured 的地图。最可能的原因是配置文件 class 与包含 Startup
class.
如果是这种情况,那么您可以在包含 AutoMapperProfiles
class -
public interface IMappingProfile
{
//
}
它的唯一目的是 mark/identify 包含您的地图的程序集。
然后注册AutoMapper
为-
services.AddAutoMapper(typeof(IMappingProfile));
编辑:
使用标记界面只是我个人的喜好,因为我倾向于为我的域模型创建单独的配置文件 classes。因此,您可以简单地省略界面并使用您的个人资料 class 类型进行注册,类型为 -
services.AddAutoMapper(typeof(AutoMapperProfiles));