簡體   English   中英

抽象通用 class 的 IncludeBase 自動映射器映射失敗

[英]Automapper mapping with IncludeBase failing for abstract generic class

我正在嘗試 map 將數據實體引用到 dtos,這兩者都從它們自己的命名空間內的通用基礎 class 繼承,並使用“通用”配置文件來添加映射。 考慮以下代碼:

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 class 的代碼被執行,但隨后出現異常,即沒有此對象的映射,特別是:

InvalidOperationException:缺少從 Dtos.ReferenceData'1[MyEnum] 到 Entities.ReferenceData'1[MyEnum] 的 map。 使用 CreateMap(ReferenceData'1, ReferenceData'1) 創建。

如您所見,我正在為兩個 ReferenceData 抽象類添加“IncludeBase”方法,所以我不明白為什么會出現此異常。

在我的 Web API 項目中,我包含了AutoMapper.Extensions.Microsoft.DependendyInjection package版本 7.0.0

謝謝你。

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>>(); 
}

有關詳細信息,請參閱映射 Inheritance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM