【问题标题】:Automapper mapping with IncludeBase failing for abstract generic class抽象泛型类的 IncludeBase 自动映射器映射失败
【发布时间】:2019-11-07 11:11:11
【问题描述】:

我正在尝试将引用数据实体映射到 dto,这两个实体都从它们自己的命名空间中的通用基类继承,并使用“通用”配置文件来添加映射。考虑以下代码:

namespace Dtos
{
    public abstract class ReferenceData<TId>
        where TId : Enum
    {
        public TId Id { get; set; }

        public string Description { get; set; }
    }

    public class ConcreteDto : ReferenceData<MyEnum> { }
}

namespace Entities
{
    public abstract class ReferenceData<TId>
        where TId : Enum
    {
        public TId Id { get; set; }

        public string Description { get; set; }
    }

    public class ConcreteEntity : ReferenceData<MyEnum> { }
}

namespace DtoMapping
{
    internal abstract class ReferenceDataDtoProfile<TDto, TEntity, TId> : Profile
    where TDto : Dtos.ReferenceData<TId>
    where TEntity : Entities.ReferenceData<TId>
    where TId : Enum
    {
        public ReferenceDataDtoProfile()
        {
        }

        protected IMappingExpression<TDto, TEntity> CreateDtoToEntityMap()
        {
            return this.CreateMap<TDto, TEntity>()
                        .IncludeBase<Dtos.ReferenceData<TId>, Entities.ReferenceData<TId>>();
        }

        protected IMappingExpression<TEntity, TDto> CreateEntityToDtoMap()
        {
            return this.CreateMap<TEntity, TDto>()
                        .IncludeBase<Entities.ReferenceData<TId>, Dtos.ReferenceData<TId>>();
        }

        protected void CreateMaps()
        {
            this.CreateDtoToEntityMap();
            this.CreateEntityToDtoMap();
        }
    }

    internal sealed class ProfileForConcreteEntity : ReferenceDataDtoProfile<Dtos.ConcreteDto, Entities.ConcreteEntity, MyEnum>
    {
        public PeriodProfile()
        {
            this.CreateMaps();
        }
    }   
}

当我运行应用程序并尝试到达有问题的端点时,我可以在调试器中看到 ReferenceDataDtoProfile 类的代码被执行,但随后我得到一个异常,即没有此对象的映射,特别是:

InvalidOperationException:缺少地图来自 Dtos.ReferenceData'1[MyEnum] 到 Entities.ReferenceData'1[MyEnum]。 使用 CreateMap(ReferenceData'1, ReferenceData'1) 创建。

如您所见,我正在为两个 ReferenceData 抽象类添加“IncludeBase”方法,所以我不明白为什么会出现此异常。

在我的 Web API 项目中,我包含了 AutoMapper.Extensions.Microsoft.DependendyInjection7.0.0 版

谢谢。

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    看来IncludeBase 只是指定派生对象的映射将继承基础对象的配置。但是,您仍然需要为基础对象和派生对象创建实际映射:

    protected IMappingExpression<TDto, TEntity> CreateDtoToEntityMap() 
    { 
        this.CreateMap<Dtos.ReferenceData<TId>, Entities.ReferenceData<TId>>();
        return this.CreateMap<TDto, TEntity>() 
            .IncludeBase<Dtos.ReferenceData<TId>, Entities.ReferenceData<TId>>(); 
    } 
    
    protected IMappingExpression<TEntity, TDto> CreateEntityToDtoMap() 
    {
        this.CreateMap<Entities.ReferenceData<TId>, Dtos.ReferenceData<TId>>();
        return this.CreateMap<TEntity, TDto>() 
            .IncludeBase<Entities.ReferenceData<TId>, Dtos.ReferenceData<TId>>(); 
    }
    

    请参阅Mapping Inheritance 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多