如何将DTO中的对象ID映射到数据库中的现有对象?

时间:2020-08-28 10:35:08

标签: c# asp.net-core .net-core entity-framework-core automapper

我正在尝试使用自动映射器和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();

        }

1 个答案:

答案 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));
相关问题