我正在尝试使用自动映射器和EF核心将对象ID映射到现有对象。
我的dto仅接受LocationId
,但是如果数据库中存在具有此类ID的对象,我想在Location
实体中映射完整的WorkRecord
对象,否则控制器将返回BadRequest
。
DTO:
public class WorkRecordCreateDto
{
[Required]
public int? LocationId { get; set; }
}
型号
public class WorkRecord
{
public int Id { get; set; }
public Location Location { get; set; }
}
控制器:
[HttpPost]
public ActionResult Post(WorkRecordCreateDto workRecordDto)
{
var workRecord = _mapper.Map<WorkRecord>(workRecordDto);
_repository.GetRepository<WorkRecord>().Add(workRecord);
_repository.SaveChanges();
return Ok();
}
答案 0 :(得分:0)
为此,我们有一个EnityConverter:
public class EntityConverter<TDestination> : IValueConverter<int, TDestination>
{
private readonly ISession session;
public EntityConverter(ISession session)
{
this.session = session;
}
public TDestination Convert(int sourceMember, ResolutionContext context)
{
return session.Get<TDestination>(sourceMember);
}
}
要使用此功能,必须配置映射器,使其可以使用DependencyInjection。我们使用Grace,并且在您的环境中会有所不同:
container.Configure(c => c.ExportFuncWithContext<IMapper>((scope, staticContext, context)
=> new Mapper(automapperConfig, t => scope.Locate(t))).Lifestyle.SingletonPerScope());
现在,您可以在AutoMapper映射中添加EntityConverter:
CreateMap<WorkRecord, WorkRecordCreateDto>()
.ReverseMap()
.ForMember(d => d.Location, opts => opts.ConvertUsing<EntityConverter<WorkRecord>, int>(src => src.LocationId));