【问题标题】:EF Core System.ObjectDisposedExceptionEF Core System.ObjectDisposedException
【发布时间】:2020-12-08 06:34:36
【问题描述】:

我收到标题中提到的这个错误。相同的代码适用于第一次 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
    ) ...

【问题讨论】:

  • 任何帮助将不胜感激。不知道如何解决这个问题
  • 我猜你提供的代码是在一个异步方法中,你是从它被调用的地方等待这个方法吗?
  • 我确实使用异步。我将添加更多代码来说明为什么其他问题可能是问题

标签: entity-framework-core


【解决方案1】:

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

尝试将类型从 Action&lt;InjectedControllerArgs, ProjectDto, NavigationElements&gt; 更改为 Func&lt;InjectedControllerArgs, ProjectDto, NavigationElements, Task&gt; 并确保到处等待。

【讨论】:

  • 谢谢。我会尽快尝试并告诉你。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2017-03-08
  • 2021-11-23
  • 2019-05-06
  • 2018-12-07
相关资源
最近更新 更多