Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть таблица для установки уровня доступа пользователя в таблице.

это мой Access:

    public Guid RoleId { get; set ; }
    public string Access { get ; set ; }

Я хочу, чтобы при изменении AccessLevel он изменил SecurityStamp в Role таблице.

    public async Task<OperationResult<string>> Handle(SetAccessLevelCommand request, CancellationToken cancellationToken)
    {
        var result = await unitOfWork.RoleRepository.AccessLevelRepository.SetAccess(new AccessLevelDto { RoleId = request.RoleId, Access = request.AccessList });
        if (result.Success)
        {
            try
            {
                try
                {
                    var findRole = await unitOfWork.RoleRepository.GetRoleByIdAsync(request.RoleId, cancellationToken);
                    findRole.Result.UpdateSecurityStamp();
                    if (findRole.Result != null)
                    {
                        unitOfWork.RoleRepository.Update(findRole.Result, cancellationToken);
                        unitOfWork.CommitSaveChange();
                        return OperationResult<string>.BuildSuccessResult("Add Success");
                    }
                }
                catch (Exception ex)
                {
                    return OperationResult<string>.BuildFailure(ex.Message);
                }
            }
            catch (Exception ex)
            {
                return OperationResult<string>.BuildFailure(ex.Message);
            }
        }
        return OperationResult<string>.BuildFailure(result.ErrorMessage);
    }

я пишу этот код для выполнения этой работы.

это SetAccess:

  public async Task<OperationResult<string>> SetAccess(AccessLevelDto accessLevels)
    {
        try
        {
            var currentRoleAccessValue = GetAccessLevels(accessLevels.RoleId);
            var currentAccess = currentRoleAccessValue.Select(x => x.Access).ToList();
            var newAccess = accessLevels.Access.Except(currentAccess).ToList();

            if (newAccess != null)
            {
                foreach (var item in newAccess)
                {
                    context.Add(new AccessLevel
                    {
                        Access = item,
                        RoleId = accessLevels.RoleId
                    });
                }
            }

            var removeItems = currentAccess.Except(accessLevels.Access).ToList();
            if (removeItems != null)
            {
                foreach (var item in removeItems)
                {
                    var accClaim = currentRoleAccessValue.SingleOrDefault(x => x.Access == item);
                    if (accClaim != null)
                    {
                        context.Remove(accClaim);
                    }
                }
            }

            return OperationResult<string>.BuildSuccessResult("SuccessAdd");
        }
        catch (Exception ex)
        {
            return OperationResult<string>.BuildFailure(ex);
        }
    }

это код для изменения State сущности, и он работал нормально, а когда я вызываю CommitSaveChange(), он работал нормально. но когда я добавляю команды RoleUpdate:

        var findRole = await unitOfWork.RoleRepository.GetRoleByIdAsync(request.RoleId, cancellationToken);
                    findRole.Result.UpdateSecurityStamp();
                    if (findRole.Result != null)
                    {
                        unitOfWork.RoleRepository.Update(findRole.Result, cancellationToken);
                    }

и затем вызываю unitOfWork.CommitSaveChange(), это показывает мне эту ошибку:

Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы вызываете Dispose () для контекста или заключаете контекст в оператор using. Если вы используете внедрение зависимостей, вы должны позволить контейнеру внедрения зависимостей избавиться от экземпляров контекста. Имя объекта: 'FilmstanContext'.

В чем проблема? как я могу решить эту проблему ????

1 Ответ

0 голосов
/ 18 апреля 2020

Когда я уже сталкивался с проблемой такого типа в прошлом, это обычно происходило из-за того, что a) отсутствовали команды await или b) asyn c методы с возвращаемым типом void. В моем случае это было связано с Entity Framework. На всякий случай это помогает. Невозможно получить доступ к удаленному объекту

Связанное наблюдение, я думаю, ваш вызов CommitSaveChange должен быть асинхронным. Это, вероятно, записывает данные в некоторый тип хранилища данных. Если чтение 'GetRoleById' асин c, я думаю, что запись также должна быть асин c. Просто мои 2 цента.

...