如何使用AutoMapper从DTO映射到PUT/POST模型? [英] How to do mapping using AutoMapper from DTO to Model both PUT/POST?

查看:66
本文介绍了如何使用AutoMapper从DTO映射到PUT/POST模型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经成功完成了从模型到DTO的AutoMapper的操作,并且效果很好.

I've managed to do the AutoMapper as follow from Model to DTOs and this works well.

private ApplicationDbContext db = new ApplicationDbContext();

        private MapperConfiguration configuration = new MapperConfiguration(cfg =>
                                        cfg.CreateMap<Activity, ActivityDTO>()
                                            .ForMember(dto => dto.OwnerName, conf => conf.MapFrom(ol => ol.User.FirstName + " " + ol.User.LastName))
                                            .ForMember(dto => dto.CategoryName, conf => conf.MapFrom(ol => ol.Category.Name)));

// GET: api/v1/Activities/5
        [HttpGet]
        [ResponseType(typeof(ActivityDTO))]
        [Route("api/v1/Activities/{id}", Name = "GetActivity")]
        public async Task<IHttpActionResult> GetActivity(int id)
        {
            string userId = User.Identity.GetUserId();

            var activityDTO = await db.Activities
                                        .Include(b => b.User)
                                        .Include(c => c.Category)
                                        .Where(q => q.UserId == userId && q.Id == id)
                                        //.Select(AsActivityDto)
                                        .ProjectTo<ActivityDTO>(configuration)
                                        .FirstOrDefaultAsync();

            if (activityDTO == null)
            {
                return NotFound();
            }

            return Ok(activityDTO);
        }

然后,我不确定如何在保存放置/放置控制器的数据之前,将DTO的AutoMapper执行回Model.处理:

Then I'm not sure how to do this AutoMapper from DTOs back to Model before saving the data for Put/Post controller ie. handing this:

activity.CategoryId = category.Id; activity.Name = activityDTO.Name; activity.Description = activityDTO.Description; activity.NoOfMinutes = activityDTO.NoOfMinutes; activity.DateModified = DateTime.UtcNow;

activity.CategoryId = category.Id; activity.Name = activityDTO.Name; activity.Description = activityDTO.Description; activity.NoOfMinutes = activityDTO.NoOfMinutes; activity.DateModified = DateTime.UtcNow;

var活动=新活动 { UserId = userId, CategoryId = category.Id, 名称= activityDTO.Name, 说明= activityDTO.Description, NoOfMinutes = activityDTO.NoOfMinutes, DateCreated = DateTime.UtcNow, DateModified = DateTime.UtcNow };

var activity = new Activity { UserId = userId, CategoryId = category.Id, Name = activityDTO.Name, Description = activityDTO.Description, NoOfMinutes = activityDTO.NoOfMinutes, DateCreated = DateTime.UtcNow, DateModified = DateTime.UtcNow };

// PUT: api/v1/Activities/5
        [HttpPut]
        [Route("api/v1/Activities/{id}")]
        [ResponseType(typeof(void))]
        public async Task<IHttpActionResult> PutActivity(int id, ActivityDTO activityDTO)
        {
            string userId = User.Identity.GetUserId();

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var category = db.Categories.SingleOrDefault(x => x.UserId == userId && x.Name == activityDTO.CategoryName);

            if (category == null)
            {
                return BadRequest("Category not valid.");
            }

            if (id != activityDTO.Id)
            {
                return BadRequest();
            }

            var activity = await db.Activities.FirstOrDefaultAsync(q => q.Id == id);

            if (activity == null)
            {
                return NotFound();
            }

            if (userId != activity.UserId)
            {
                return BadRequest("No right access to update");
            }

            activity.CategoryId = category.Id;
            activity.Name = activityDTO.Name;
            activity.Description = activityDTO.Description;
            activity.NoOfMinutes = activityDTO.NoOfMinutes;
            activity.DateModified = DateTime.UtcNow;

            db.Entry(activity).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ActivityExists(id))
                {
                    return NotFound();
                }
                else
                {
                    return BadRequest("The model is invalid");
                }
            }

            return Ok();
        }

        // POST: api/Activities
        [HttpPost]
        [Route("api/v1/Activities")]
        [ResponseType(typeof(Activity))]
        public async Task<IHttpActionResult> PostActivity(ActivityDTO activityDTO)
        {
            string userId = User.Identity.GetUserId();

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var category = db.Categories.SingleOrDefault(x => x.UserId == userId && x.Name == activityDTO.CategoryName);

            if (category == null)
            {
                return BadRequest("Category not valid.");
            }

            var activity = new Activity
            {
                UserId = userId,
                CategoryId = category.Id,
                Name = activityDTO.Name,
                Description = activityDTO.Description,
                NoOfMinutes = activityDTO.NoOfMinutes,
                DateCreated = DateTime.UtcNow,
                DateModified = DateTime.UtcNow
            };

            db.Activities.Add(activity);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                return BadRequest("The model is invalid");
            }

            var newActivityDto = await db.Activities
                                        .Include(b => b.User)
                                        .Include(c => c.Category)
                                        .Where(q => q.UserId == userId && q.Id == activity.Id)
                                        //.Select(AsActivityDto)
                                        .ProjectTo<ActivityDTO>(configuration)
                                        .FirstOrDefaultAsync();

            return CreatedAtRoute("GetActivity", new { id = newActivityDto.Id }, newActivityDto);
        }

已更新:

private MapperConfiguration configuration = new MapperConfiguration(cfg => {
                                                                                cfg.CreateMap<Activity, ActivityDTO>()
                                                                                    .ForMember(dst => dst.OwnerName, src => src.MapFrom(ol => ol.User.FirstName + " " + ol.User.LastName))
                                                                                    .ForMember(dst => dst.CategoryName, src => src.MapFrom(ol => ol.Category.Name));
            cfg.CreateMap<ActivityDTO, Activity>()
                .ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()))
                .ForMember(dst => dst.CategoryId, opt => opt.MapFrom(src => GetCategoryId(HttpContext.Current.User.Identity.GetUserId(), src.CategoryName)))
                .ForMember(dst => dst.DateCreated, opt => opt.MapFrom(src => DateTime.UtcNow))
                .ForMember(dst => dst.DateModified, opt => opt.MapFrom(src => DateTime.UtcNow));
        });

,并修改了POST,如下所示:

and modified POST as follow:

 // POST: api/Activities
        [HttpPost]
        [Route("api/v1/Activities")]
        [ResponseType(typeof(Activity))]
        public async Task<IHttpActionResult> PostActivity(ActivityDTO activityDTO)
        {
            string userId = User.Identity.GetUserId();

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var category = db.Categories.SingleOrDefault(x => x.UserId == userId && x.Name == activityDTO.CategoryName);

            if (category == null)
            {
                return BadRequest("Category not valid.");
            }

            /*category.UserId = userId,
                CategoryId = category.Id,
                Name = activityDTO.Name,
                Description = activityDTO.Description,
                NoOfMinutes = activityDTO.NoOfMinutes,
                DateCreated = DateTime.UtcNow,
                DateModified = DateTime.UtcNow
            };*/

            //var activity = mapper.Map<ActivityDTO, Activity>(activityDTO);
            var activity = configuration.CreateMapper().Map<ActivityDTO, Activity>(activityDTO);


            db.Activities.Add(activity);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                return BadRequest("The model is invalid");
            }

            var newActivityDto = await db.Activities
                                        .Include(b => b.User)
                                        .Include(c => c.Category)
                                        .Where(q => q.UserId == userId && q.Id == activity.Id)
                                        //.Select(AsActivityDto)
                                        .ProjectTo<ActivityDTO>(configuration)
                                        .FirstOrDefaultAsync();

            return CreatedAtRoute("GetActivity", new { id = newActivityDto.Id }, newActivityDto);
        }

推荐答案

您需要在MapperConfiguration中映射添加/更新DTO

You need to map your add/update DTO in MapperConfiguration

CreateMap<ActivityDTO, Activity>();
CreateMap<ActivityUpdateDTO, Activity>();

然后您需要添加映射器

public async Task<IHttpActionResult> PostActivity(ActivityDTO activityDTO)
        {
            string userId = User.Identity.GetUserId();

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var category = db.Categories.SingleOrDefault(x => x.UserId == userId && x.Name == activityDTO.CategoryName);

            if (category == null)
            {
                return BadRequest("Category not valid.");
            }

            //var activity = new Activity
            //{
                //UserId = userId,
                //CategoryId = category.Id,
                //Name = activityDTO.Name,
                //Description = activityDTO.Description,
                //NoOfMinutes = activityDTO.NoOfMinutes,
                //DateCreated = DateTime.UtcNow,
                //DateModified = DateTime.UtcNow
            //};

            var activity = Mapper.Map<ActivityDTO, Activity>(activityDTO);

            db.Activities.Add(activity);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                return BadRequest("The model is invalid");
            }

            var newActivityDto = await db.Activities
                                        .Include(b => b.User)
                                        .Include(c => c.Category)
                                        .Where(q => q.UserId == userId && q.Id == activity.Id)
                                        //.Select(AsActivityDto)
                                        .ProjectTo<ActivityDTO>(configuration)
                                        .FirstOrDefaultAsync();

            return CreatedAtRoute("GetActivity", new { id = newActivityDto.Id }, newActivityDto);
        }

这篇关于如何使用AutoMapper从DTO映射到PUT/POST模型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆