【问题标题】:Missing Map from 'Object' to 'Object' when using ProjectTo<>使用 ProjectTo<> 时缺少从“对象”到“对象”的映射
【发布时间】:2021-04-11 02:42:29
【问题描述】:

我正在开发 Web API,并使用 AutoMapper(10.1.1) 将映射从域模型转换为应用程序模型

我已经在应用层注册了AutoMapper

 public static IServiceCollection ConfigureAppServices(this IServiceCollection services)
    {
        services.AddAutoMapper(Assembly.GetExecutingAssembly());
        services.AddMediatR(Assembly.GetExecutingAssembly());
        
        //services.AddMvc().AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<StartUp>())
        // services.AddControllersWithViews();
        
        return services;
    }

在 Web API startup.cs 中使用了这个类

services.ConfigureAppServices();

我有一个名为 IMapFrom 的通用映射接口

public interface IMapFrom<T>
{
  void Mapping(Profile profile) => profile.CreateMap(typeof(T), GetType());
}

映射是从“JobModel”到“JobDetailsDto”

public class JobDetailsDto: IMapFrom<JobModel>
{
    public JobDetailsDto()
    {

    }
    public string Id { get; set; }
    public string Name { get; set; }
    public string JobType { get; set; }
    public string ShipBranch { get; set; }
    public string ProjectManager { get; set; }

    public void Mapping(Profile profile)
    {
        profile.CreateMap<JobModel, JobDetailsDto>()
            .ForMember(d => d.ShipBranch, opt => opt.MapFrom(s => s.PriceBranch))
            .ForMember(d => d.ProjectManager, opt => opt.MapFrom(s => s.BidderId));
    }
}

JobModel.cs

public class JobModel
{
    public JobModel()
    {
    }

    public int Id { get; set; }
    public DateTime BidDate { get; set; }
    public string JobType { get; set; }
    public DateTime CreatedDate { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string BidderId { get; set; }
    public string PriceBranch { get; set; }
    public string Name { get; set; }

}

我正在使用 MediaTr 处理 API 请求

public async Task<JobDetailsDto> Handle(GetJobDetailsQuery request, CancellationToken cancellationToken)
    {
        var vm = await _context.JobModels
                .Where(e => e.Id == request.Id)
                .ProjectTo<JobDetailsDto>(_mapper.ConfigurationProvider)
                .SingleOrDefaultAsync(cancellationToken);

        return vm;
    }

当我执行 'GET' 获取 'JobModel' 对象中的数据并转换为 'JobDetailsDto' 时会抛出以下错误

System.InvalidOperationException:缺少从 Domain.Entities.JobModel 到 Application.ApplicationBusiness.Job.Queries.JobDetailsDto 的映射。使用 CreateMap 创建。 在 AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest 请求,表达式实例参数,IDictionary2 typePairCount, LetPropertyMaps letPropertyMaps, TypeMap&amp; typeMap) at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary2 typePairCount,LetPropertyMaps letPropertyMaps) 在 AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest 请求) 在 AutoMapper.Internal.LockingConcurrentDictionary2.&lt;&gt;c__DisplayClass2_1.&lt;.ctor&gt;b__1() at System.Lazy1.ViaFactory(LazyThreadSafetyMode 模式) 在 System.Lazy1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy1.CreateValue() 在 System.Lazy1.get_Value() at AutoMapper.Internal.LockingConcurrentDictionary2.GetOrAdd(TKey 键) 在 AutoMapper.QueryableExtensions.ExpressionBuilder.GetMapExpression(类型 sourceType,类型 destinationType,对象参数,MemberInfo[] membersToExpand) 在 AutoMapper.QueryableExtensions.ProjectionExpression.ToCore(类型 destinationType,对象参数,IEnumerable1 memberPathsToExpand) at AutoMapper.QueryableExtensions.ProjectionExpression.ToCore[TResult](Object parameters, IEnumerable1 memberPathsToExpand) 在 AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](对象参数,Expression1[] membersToExpand) at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression1[] membersToExpand) 在 AutoMapper.QueryableExtensions.Extensions.ProjectTo[Tdestination](IQueryable 源,IConfigurationProvider 配置,Expression`1[] membersToExpand)

【问题讨论】:

标签: asp.net-core entity-framework-core automapper automapping


【解决方案1】:

试试这个。

public JobDetailsDto()
 {
    Mapping();
 }
 public void Mapping()
 {
    CreateMap<JobModel, JobDetailsDto>()
        .ForMember(d => d.ShipBranch, opt => opt.MapFrom(s => s.PriceBranch))
        .ForMember(d => d.ProjectManager, opt => opt.MapFrom(s => s.BidderId));
 }

另一个解决方案不是在 dto 中编写映射,而是应该创建 MappingProfile,您将在其中添加映射。然后在您的服务中,您应该将其添加到构造函数中

_mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<MappingProfile>(); });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2019-09-19
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多