2016-09-14 2 views
2

DTO를 사용하여 엔티티를 만들고 싶을 때 컨트롤러에있는 DTO에 최근 삽입 된 엔티티의 ID를 가져 오려고합니다.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를 검색하려면? SaveChanges를 한 후

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

는 t의 ID가 설정지고 있지만 내 DTO의 ID를 검색하는 데 실패하고있어 충돌 다시 컨트롤러에서 개체를 가져옵니다.

어떤 조언이 필요합니까?

+3

해보십시오 검색을,이 시간을 많이 논의되고있다. 맵핑을 통해 뷰 모델과 DTO 사이의 관계를 잃어 버리므로 하나에 대한 업데이트로 다른 모델을 업데이트하지 않습니다. ID를 리턴하거나, DTO를 리턴하거나,'out' 매개 변수를 사용하여 ID를 생성하거나, ID를 생성하여'Create()'에 전달하십시오. 후자는 contra-pragmatic으로 볼 수있는 Command Query Responsibility Segregation (CQRS)을 준수합니다. – CodeCaster

+2

'SaveChanges'가 호출 된 후,'t.ID'는 그 값을 가져야합니다. 그래서,'_unitOfWork.Commit();'뒤에'entity.ID = t.ID;'를 설정하면 그것은 당신을 위해 작동 할 것입니다. –

+1

@Adil no, 엔티티는 viewmodel에서 매핑 된 DTO에서 매핑됩니다. DTO에 대한 업데이트는 뷰 모델을 업데이트하지 않습니다. – CodeCaster

답변

2

당신은 단순히 바로 바로 선 후, 즉 커밋 변경 후 entity.Id = t.Id;을 추가 할 수 있습니다 _unitOfWork.Commit();

+0

감사합니다, 매력처럼 작동합니다! – user2963570