[英]Error: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection
[英]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.