在使用依赖注入和工作单元时如何获取生成的商品ID?

时间:2018-11-03 12:48:55

标签: c# dependency-injection entity-framework-6 unit-of-work

我正在使用ASP.NET MVC5,实体框架6,依赖注入和工作单元。

在数据库中保存新项目时遇到问题。我无法获取刚刚插入的项目的新生成的ID。

下面是我的代码示例,只是为了进一步了解我的问题:

  

这是我的服务

public class UserService : IUserService
{
    IUnitOfWork _unitOfWork;
    IUserRepository _userRepository;

    public UserService(IUnitOfWork unitOfWork, IUserRepository UserRepository)
    {
        _unitOfWork = unitOfWork;
        _userRepository = UserRepository;
    }
    public int Create(UserDTO entity)
    {
        if(entity == null)
        {
            throw new ArgumentNullException("entity");
        }

        entity = _userRepository.Add(entity);
        _unitOfWork.Commit();

        return entity.UserID;
    }
}
  

这是我的资料库

public virtual TEntityDTO Add(TEntityDTO entity)
{
    var item = Mapper.Map<TEntityDTO, TEntity>(entity);
    var createItem = Mapper.Map<TEntity, TEntityDTO>(context.Set<TEntity>().Add(item));
    return createItem;
}
  

这是我的工作单位

public int Commit()
{
    // Save changes with the default options
    return _dbContext.SaveChanges();
}

1 个答案:

答案 0 :(得分:1)

  

我不知道实体框架,但问题对我来说很明显。

entity=_userRepository.Add(entity);行调用存储库的Add方法。在存储库的Add方法中,您要添加一个实体,然后将其映射回到DTO。然后,您将返回映射的DTO。请注意,此处已将DTO与您的实体分离。它不再能够反映实体中的更改。

然后在您的服务中,致电_unitOfWork.Commit();。这会将更改刷新到数据库,实际上在这里生成了新的ID。新的ID会反映在您的实体中。但是,当您正在处理不再与Entity连接的DTO时,就看不到该新生成的ID。

那该怎么办?我不知道,这取决于您的总体架构。

  1. 返回实体,而不用DTO映射它。
  2. 提交内部存储库而不是服务。