【问题标题】:Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection无法访问已处置的对象。此错误的一个常见原因是处理从依赖注入中解析的上下文
【发布时间】:2020-04-19 01:35:46
【问题描述】:

我在 Tabel 中有设置用户访问级别的表。

这是我的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(),它会告诉我这个错误:

无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。对象名称:'FilmstanContext'。

有什么问题吗?我该如何解决这个问题????

【问题讨论】:

  • 为什么会有多个 try/catch 块像这样立即相互嵌套?您的代码可以从 rubber duck debugging 中受益。

标签: c# asp.net asp.net-core domain-driven-design


【解决方案1】:

当我过去看到此类问题时,通常是由于 a) 缺少等待命令或 b) 具有 void 返回类型的异步方法。就我而言,它与实体框架有关。以防万一它有帮助。 Cannot access a disposed object

相关的观察,我认为您对 CommitSaveChange 的调用应该是异步的。这可能会将数据写入某种类型的数据存储。如果阅读“GetRoleById”是异步的,我认为写作也应该是异步的。只是我的 2 美分。

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2020-04-25
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多