2016-09-14 73 views
2

当我想使用DTO创建一个实体时,我想获取最近插入的实体的ID,它位于我的控制器中的DTO中。C#DTO获取实体的ID

控制器:

public ActionResult Create(HotelsViewModel hotelsViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     HotelsDTO hotelDTO = _mapper.Map<HotelsDTO>(hotelsViewModel); 

     _hotelService.Create(hotelDTO); 
     _hotelService.AddHotelAmenities(hotelDTO.Id, hotelsViewModel.SelectedAmenities); 

     return RedirectToAction("Index"); 
    } 

    return View(hotelsViewModel); 
} 

服务:

要检索的Id回到我的控制,我应该改变创建方法的返回类型为整数或有另一种方式来完成这项工作?

public void Create(TDTO entity) 
{ 
    T t = _mapper.Map<T>(entity); 
    _repository.Create(t); 
    _unitOfWork.Commit(); 
} 

调用SaveChanges之后被击中T的ID是越来越设置,但我没能找回我的DTO对象的ID后面的控制器。

有什么建议吗?

+3

尝试搜索,这已经讨论过很多次。你通过映射失去了viewmodel和DTO之间的关系,所以一个更新不会更新另一个。返回ID,返回DTO,使用'out'参数做相同的事情或事先生成ID并传递给'Create()'。后者将符合命令查询责任隔离(CQRS),这可被视为对立务实。 – CodeCaster

+2

调用'SaveChanges'后,'t.ID'应该有它的值。所以,如果你在'_unitOfWork.Commit();'后设置'entity.ID = t.ID;'它应该适合你。 –

+1

@Adil否,实体从DTO映射而来,DTO从视图模型映射而来。对DTO的更新不会更新视图模型。 – CodeCaster

回答

2

您可以简单地添加entity.Id = t.Id;行权后提交变更之后,即右:_unitOfWork.Commit();

+0

谢谢,作品像一个魅力! – user2963570