簡體   English   中英

無法訪問已處置的 object。 此錯誤的常見原因是處理從依賴注入中解析的上下文

[英]Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection

我有在表中設置用戶訪問級別的表。

這是我的Access

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

我想在更改AccessLevel時必須更改Role表中的SecurityStamp

    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()它告訴我這個錯誤:

無法訪問已處置的 object。 此錯誤的一個常見原因是釋放從依賴注入中解析的上下文,然后嘗試在應用程序的其他地方使用相同的上下文實例。 如果您在上下文上調用 Dispose() 或將上下文包裝在 using 語句中,則可能會發生這種情況。 如果你使用依賴注入,你應該讓依賴注入容器負責處理上下文實例。 Object 名稱:'FilmstanContext'。

有什么問題? 我怎么解決這個問題????

當我過去看到此類問題時,通常是由於 a) 缺少等待命令或 b) 具有 void 返回類型的異步方法。 就我而言,它與實體框架有關。 以防萬一它有幫助。 無法訪問已處置的 object

一個相關的觀察,我認為您對 CommitSaveChange 的調用應該是異步的。 這可能會將數據寫入某種類型的數據存儲。 如果閱讀“GetRoleById”是異步的,我認為寫作也應該是異步的。 只是我的2美分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM