如何使用AutoMapper从DTO映射到PUT/POST模型? [英] How to do mapping using AutoMapper from DTO to Model both 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屋!