Как получить сгенерированный идентификатор элемента при использовании внедрения зависимостей и единиц работы? - PullRequest
0 голосов
/ 03 ноября 2018

Я использую ASP.NET MVC5, Entity Framework 6, внедрение зависимостей и единицу работы.

Возникла проблема при сохранении нового элемента в базе данных. Я не могу получить новый сгенерированный идентификатор только что вставленного элемента.

Ниже приведен пример моего кода, просто чтобы узнать больше о моей проблеме:

Вот мой сервис

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 голосов
/ 05 ноября 2018

Я не знаю Entity Framework, но проблема для меня очевидна.

Строка entity=_userRepository.Add(entity); вызывает Add метод репозитория. В вашем методе Add в репозитории вы добавляете сущность, а затем отображаете ее обратно в DTO. Вы тогда возвращаете сопоставленный DTO. Обратите внимание, что DTO отделен от вашей сущности. Он больше не может отражать изменения в сущности.

Тогда к вашим услугам вы звоните _unitOfWork.Commit();. Это сбрасывает изменения в базу данных, и здесь фактически генерируется новый идентификатор. Этот новый идентификатор отражается в вашей сущности. Но поскольку вы имеете дело с DTO, который больше не связан с Entity, вы не сможете увидеть этот недавно сгенерированный идентификатор.

Каково решение тогда? Я не знаю, это зависит от вашей общей архитектуры.

  1. Вернуть сущность, не отображая ее с помощью DTO.
  2. Фиксация внутри репозитория вместо Сервиса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...