2016-09-14 39 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