如何将包含对象的实体转换为 AutoMapper 中的其他实体?
How to cast entity with included object to other entity in AutoMapper?
我在项目中使用 AutoMapper,我需要将包含对象的域实体转换为视图模型。
包含对象是具有对象当前特征的域实体的当前状态。视图模型具有与其他属性(不包含对象)处于同一级别的特征属性,因为我认为这是更好的解决方案。
我尝试在 MapperProfile 中使用此代码:
CreateMap<DomainEntity, ViewModel>
.ForMember(...)
...
.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<IncludedEntity, ViewModel>(source.Child)));
但此解决方案抛出异常“映射器未初始化。使用适当的配置调用初始化。如果您尝试通过容器或其他方式使用映射器实例,请确保您没有对静态 Mapper.Map 方法,如果您使用的是 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider 实例。"
我正在使用 Autofac 和映射器实例。
我该怎么做?
更新
域实体:
public class Balloon : BaseIdEntity
{
public int Id { get; set; }
public string FactoryNumber { get; set; }
/// <summary>
/// it's CurrentState of balloon.
/// </summary>
public BalloonSnapshot ActualSnapshot { get; set; }
public int? ActualSnapshotId { get; set; }
}
当前状态:
public class BalloonSnapshot : BaseIdEntity
{
public int Id { get; set; }
/// <summary>
/// It's parent Domaint entity.
/// </summary>
public Balloon Balloon { get; set; }
public int BalloonId { get; set; }
public DateTime Date { get; set; }
}
视图模型:
public class BalloonDetailDto
{
public int Id { get; set; }
public string FactoryNumber { get; set; }
public DateTime? Date { get; set; }
}
更新 2
我的映射:
CreateMap<Balloon, BalloonDetailDto>
.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<BalloonSnapshot, BalloonDetailDto>(source)));
CreateMap<BalloonSnapshot, BalloonDetailDto>()
.ForMember(s => s.Id, opt => opt.Ignore());
所以,我想用一个字符串来转换 DomaintEntity:
var viewModel = _mapper.Map<Balloon, BalloonDetailDto>(balloon);
我在这个问题的评论中找到了工作解决方案:
需要用到这个:
.ConstructUsing((source, ctx) => ctx.Mapper.Map<IncludedEntity, ViewModel>(source.Child))
改为:
.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<IncludedEntity, ViewModel>(source.Child)));
我在项目中使用 AutoMapper,我需要将包含对象的域实体转换为视图模型。 包含对象是具有对象当前特征的域实体的当前状态。视图模型具有与其他属性(不包含对象)处于同一级别的特征属性,因为我认为这是更好的解决方案。 我尝试在 MapperProfile 中使用此代码:
CreateMap<DomainEntity, ViewModel>
.ForMember(...)
...
.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<IncludedEntity, ViewModel>(source.Child)));
但此解决方案抛出异常“映射器未初始化。使用适当的配置调用初始化。如果您尝试通过容器或其他方式使用映射器实例,请确保您没有对静态 Mapper.Map 方法,如果您使用的是 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider 实例。"
我正在使用 Autofac 和映射器实例。 我该怎么做?
更新
域实体:
public class Balloon : BaseIdEntity
{
public int Id { get; set; }
public string FactoryNumber { get; set; }
/// <summary>
/// it's CurrentState of balloon.
/// </summary>
public BalloonSnapshot ActualSnapshot { get; set; }
public int? ActualSnapshotId { get; set; }
}
当前状态:
public class BalloonSnapshot : BaseIdEntity
{
public int Id { get; set; }
/// <summary>
/// It's parent Domaint entity.
/// </summary>
public Balloon Balloon { get; set; }
public int BalloonId { get; set; }
public DateTime Date { get; set; }
}
视图模型:
public class BalloonDetailDto
{
public int Id { get; set; }
public string FactoryNumber { get; set; }
public DateTime? Date { get; set; }
}
更新 2
我的映射:
CreateMap<Balloon, BalloonDetailDto>
.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<BalloonSnapshot, BalloonDetailDto>(source)));
CreateMap<BalloonSnapshot, BalloonDetailDto>()
.ForMember(s => s.Id, opt => opt.Ignore());
所以,我想用一个字符串来转换 DomaintEntity:
var viewModel = _mapper.Map<Balloon, BalloonDetailDto>(balloon);
我在这个问题的评论中找到了工作解决方案:
需要用到这个:
.ConstructUsing((source, ctx) => ctx.Mapper.Map<IncludedEntity, ViewModel>(source.Child))
改为:
.ForPath(dest => dest, opt => opt.MapFrom(source =>
Mapper.Map<IncludedEntity, ViewModel>(source.Child)));