【发布时间】:2016-09-14 09:57:11
【问题描述】:
当我想使用 DTO 创建实体时,我想获取 DTO 中最近插入的实体的 ID,该 DTO 位于我的控制器中。
控制器:
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 方法的返回类型更改为整数,还是有其他方法可以使它工作?
public void Create(TDTO entity)
{
T t = _mapper.Map<T>(entity);
_repository.Create(t);
_unitOfWork.Commit();
}
在 savechanges 被命中后,t 的 id 被设置,但我无法在控制器中检索我的 DTO 对象中的 id。
有什么建议吗?
【问题讨论】:
-
尝试搜索,这已经讨论过很多次了。您通过映射失去了 viewmodel 和 DTO 之间的关系,因此对一个的更新不会更新另一个。要么返回 ID,返回 DTO,使用
out参数执行相同操作,要么预先生成 ID 并将其传递给Create()。后者将符合命令查询职责分离 (CQRS),这可以被视为反语用。 -
SaveChanges被调用后,你的t.ID应该有它的值。所以,如果你在_unitOfWork.Commit();之后设置entity.ID = t.ID;它应该适合你。 -
@Adil 不,实体是从 DTO 映射的,它是从视图模型映射的。对 DTO 的更新不会更新视图模型。
-
@CodeCaster,我明白你的意思,但我认为 OP 不需要 viewModel.ID,我认为他/她需要 DTO.ID,因为它像
_hotelService.AddHotelAmenities(hotelDTO.Id, hotelsViewModel.SelectedAmenities);一样使用。 -
@Adil 你说得对。
标签: c# entity-framework dto