使用 IncludeBase 的 Automapper 映射因抽象泛型失败 class
Automapper mapping with IncludeBase failing for abstract generic class
我正在尝试将引用数据实体映射到 dto,这两者都继承自它们自己命名空间内的通用基础 class,并使用 "all purpose" 配置文件添加映射。考虑以下代码:
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: Missing map from
Dtos.ReferenceData'1[MyEnum] to Entities.ReferenceData'1[MyEnum].
Create using CreateMap(ReferenceData'1, ReferenceData'1).
如您所见,我正在为两个 ReferenceData 抽象 classes 添加 "IncludeBase" 方法,所以我不明白为什么会出现此异常。
在我的 Web API 项目中,我包含了 AutoMapper.Extensions.Microsoft.DependendyInjection 包 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>>();
}
有关详细信息,请参阅 Mapping Inheritance。
我正在尝试将引用数据实体映射到 dto,这两者都继承自它们自己命名空间内的通用基础 class,并使用 "all purpose" 配置文件添加映射。考虑以下代码:
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: Missing map from Dtos.ReferenceData'1[MyEnum] to Entities.ReferenceData'1[MyEnum]. Create using CreateMap(ReferenceData'1, ReferenceData'1).
如您所见,我正在为两个 ReferenceData 抽象 classes 添加 "IncludeBase" 方法,所以我不明白为什么会出现此异常。
在我的 Web API 项目中,我包含了 AutoMapper.Extensions.Microsoft.DependendyInjection 包 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>>();
}
有关详细信息,请参阅 Mapping Inheritance。