2016-09-14 6 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を取得し、私は整数としてCreateメソッドの戻り値の型を変更する必要がありますか、この作品を作るための別の方法は何ですか? SaveChangesメソッドがヒットします後

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

トンのIDが設定されつつあるが、私は戻って、コントローラの私のDTOオブジェクトのIDを取得するために失敗しています。

アドバイスはありますか?あなたは、単に、すなわち、右の行の後に、右の変更をコミットした後entity.Id = t.Id;を追加することができます

+3

てみ検索を、これは時間の多くを議論してきました。ビューモデルとDTOの関係はマッピングによって失われます。したがって、一方を更新すると他方が更新されません。 IDを返すか、DTOを返すか、 'out'パラメータを使ってIDを生成するか、あらかじめIDを生成して' Create() 'に渡します。後者は、対照的であると見ることができるコマンドクエリ責任分担(Command Query Responsibility Segregation:CQRS)に準拠する。 – CodeCaster

+2

'SaveChanges'が呼ばれた後、あなたの' t.ID'はその値を持つべきです。したがって、 '_unitOfWork.Commit();'の後に 'entity.ID = t.ID;'を設定すると、それはうまくいくはずです。 –

+1

@Adil no、エンティティは、ビューモデルからマップされたDTOからマップされます。 DTOへの更新はviewmodelを更新しません。 – CodeCaster

答えて

2

_unitOfWork.Commit();

+0

ありがとうございます、魅力のように動作します! – user2963570

関連する問題