簡體   English   中英

實體框架錯誤:無法訪問已處置的 object

[英]Entity framework error : Cannot access a disposed object

在下面使用 asp.net 內核中的 c# 編寫的方法中,執行以下任何更新語句時都會出錯。 使用 await SaveContextAsync() 有什么問題; 我注意到僅使用 SaveContext(); 時不會出錯

我得到的錯誤如下

 Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection 
 and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() 
 on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency 
 injection container take care of disposing context instances.
 Object name: 'FXDB1Context'.

我不確定為什么會收到此錯誤。

 public async Task<IdentityResult> ApproveUserChangeRequest(UserChangeRequest userChangeRequest, string approvedByAuthUserName, string authApplicationName)
    {
        var userChangeRequestRepository = UserChangeRequestRepository.GetAllAsList();
        var userChangeRequestApprovalRepository = UserChangeRequestApprovalRepository.GetAllAsList();
        var appSettingRepository = AppSettingRepository.GetAllAsList();
        var clientCompanyContactRepository = ClientCompanyContactRepository.GetAllAsList();
        var applicationUserRepo = ApplicationUserRepo.GetAllAsList();
        int approvedByAuthUserID = GetApprovedByUserId(authApplicationName, approvedByAuthUserName);

        // Check if UserChangeRequest is still Pending
        bool isUserChangeRequestPending = userChangeRequestRepository.Any(x => x.Id == userChangeRequest.Id && x.ChangeStatus == "Pending");

        if (isUserChangeRequestPending && approvedByAuthUserID > 0)
        {
            // Inserting record in the UserChangeRequestApproval table
            InsertUserChangeRequestApproval(userChangeRequest);
            await SaveContextAsync();

            using (var userTransaction = Context.Database.BeginTransaction())
            {
                using (var securityTransaction = _securityContext.Database.BeginTransaction())
                {
                    try
                    {
                        //Get the Number of approval required for Internal and External Users
                        int? internalApprovalsRequired = GetApprovals("InternalUserChangeRequestApprovalsRequired", appSettingRepository);
                        int? externalApprovalsRequired = GetApprovals("ExternalUserChangeRequestApprovalsRequired", appSettingRepository);

                        //Get the name of the application the auth user belongs to
                        var authUserApplicationName = GetApplicationName(userChangeRequest.AuthUserId);

                        //Get the Number of approvals for the request
                        var numberOfAprovals = userChangeRequestApprovalRepository.Where(x => x.UserChangeRequestId == userChangeRequest.Id).Count();

                        //If the number of approvals is equal or greater than the Approvals required then Update AppUser or Contact details
                        if ((authUserApplicationName == "ArgentexTrader" && numberOfAprovals >= internalApprovalsRequired) || (authUserApplicationName == "ArgentexClient" && numberOfAprovals >= externalApprovalsRequired))
                        {
                            //Updating the clientcontact table
                            UpdateClientContact(userChangeRequest, clientCompanyContactRepository);


                            //Updating the auth user table
                            UpdateAuthUser(userChangeRequest);


                            //Updating the IdentityDB user table
                            UpdateIdentityDBUser(userChangeRequest, applicationUserRepo);

                            //Updating the UserChangeRequest table
                            userChangeRequest.ChangeStatus = "Approved";
                            UserChangeRequestRepository.Update(userChangeRequest);

                            await SaveContextAsync();
                            userTransaction.Commit();
                            securityTransaction.Commit();
                            return IdentityResult.Success;
                        }

                    }
                    catch (Exception ex)
                    {
                        userTransaction.Rollback();
                        securityTransaction.Rollback();
                        _logger.Error(ex);
                        return IdentityResult.Failed(new IdentityError { Description = ex.Message });
                    }
                }
            }
        }
        return null;
    }

該錯誤表示已解析的上下文正在嘗試制作Disposable

更多信息: 使用 C# 中的語句

using語句是 scope 唯一進程,所以這個錯誤意味着你的程序試圖在其他地方使用相同的“上下文”實例,它不能使用它,因為正如我提到的它是一個“僅限范圍”進程。

在您的示例中:

using (var userTransaction = Context.Database.BeginTransaction())
{
   using (var securityTransaction = _securityContext.Database.BeginTransaction())
   {
   }
}

您可以使其簡單並且不使用using scope 或者您可以確定,上下文僅用於using范圍的那些。

暫無
暫無

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

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