【问题标题】:C# DTO get Id of EntityC# DTO 获取实体 ID
【发布时间】: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


【解决方案1】:

您可以在提交更改后立即添加entity.Id = t.Id;,即在以下行之后:_unitOfWork.Commit();

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2012-11-10
    相关资源
    最近更新 更多