EF核心System.ObjectDisposedException

时间:2020-08-19 03:00:50

标签: entity-framework-core

我得到标题中提到的此错误。相同的代码适用于第一个API调用,但不适用于第二个API。在第二个SaveChangesAsync()通话中失败

await dbContext.SaveChangesAsync().ConfigureAwait(false);  

我正在使用

services.AddTransient<ProjectContext>(); 

在我的startup.cs中。我尝试了AddScope,但没有用。

错误:

System.ObjectDisposedException:'无法访问已处置的对象。导致此错误的常见原因是,处理从依赖项注入中解析出来的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果在上下文上调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况。如果使用依赖项注入,则应让依赖项注入容器负责处理上下文实例。
对象名称:“ ProjectContext”。

代码:

private readonly Action<InjectedControllerArgs, ProjectDto, NavigationElements> _postAfterSave = async (injectedControllerArgs, dto, nav) => {
var memberClient = new MemberClient { MemberId = member.MemberId, 
                                      InvitationEmail = member.Email, 
                                      ClientId = dto.ClientId, 
                                      LastModifierId = member.MemberId };   
await dbContext.MemberClient!.AddAsync(memberClient).ConfigureAwait(false);
await dbContext.SaveChangesAsync().ConfigureAwait(false);
             
var role = await dbContext.Role.Where(r => "client-admin" == r.RoleCode)
                               .FirstOrDefaultAsync()
                               .ConfigureAwait(false);
await dbContext.MemberClientRole!.AddAsync(new MemberClientRole
                                               { LastModifierId = member.MemberId, 
                                                 MemberClientId = memberClient.MemberClientId, 
                                                 RoleId = role.RoleId })
                                 .ConfigureAwait(false);
await dbContext.SaveChangesAsync().ConfigureAwait(false); }


    public async Task<ActionResult<ProjectDto>> PostInsertAsync(int customerId, int clientId, ProjectDto dto)
    {
        if (dto == null) throw new ArgumentNullException(nameof(dto));
        dto.CustomerId = customerId;
        dto.ClientId = clientId;
        return await _pmBaseController.PostAsync(new NavigationElements(customerId, clientId, null), Topic, dto,
            _returnOne, _postBeforeSave, _postAfterSave).ConfigureAwait(false);
    }


    public async Task<IActionResult> PutAsync(NavigationElements nav,
        TopicName topic,
        int id,
        TDto dto,
        Func<InjectedControllerArgs, NavigationElements, int, Task<T>> returnOne,
        Func<TDto, int, TDto>? putBeforeSave = null,
        Action<InjectedControllerArgs, TDto, NavigationElements>? putAfterSave = null
    ) ...

1 个答案:

答案 0 :(得分:2)

您的_postAfterSave委托是异步的,但没有返回Task,这实际上意味着它是async void,因此您的_pmBaseController无法等待,这意味着执行将在执行之前Action完成。第一个SaveChanges起作用的是时间/巧合。

尝试将类型从Action<InjectedControllerArgs, ProjectDto, NavigationElements>更改为Func<InjectedControllerArgs, ProjectDto, NavigationElements, Task>,并确保在所有地方等待它。

相关问题