代码之家  ›  专栏  ›  技术社区  ›  chobo2

Foreach循环(即循环ef模型)中的Async/Await生成错误

  •  0
  • chobo2  · 技术社区  · 6 年前

    System.InvalidOperationException
      HResult=0x80131509
      Message=Error generated for warning 'Microsoft.EntityFrameworkCore.Infrastructure.LazyLoadOnDisposedContextWarning: An attempt was made to lazy-load navigation property 'Company' on entity type 'RecurringInvoiceTemplateProxy' after the associated DbContext was disposed.'. This exception can be suppressed or logged by passing event ID 'CoreEventId.LazyLoadOnDisposedContextWarning' to the 'ConfigureWarnings' method in 'DbContext.OnConfiguring' or 'AddDbContext'.
      Source=Microsoft.EntityFrameworkCore
      StackTrace:
       at Microsoft.EntityFrameworkCore.Diagnostics.EventDefinition`2.Log[TLoggerCategory](IDiagnosticsLogger`1 logger, WarningBehavior warningBehavior, TParam1 arg1, TParam2 arg2, Exception exception)
       at Microsoft.EntityFrameworkCore.Internal.CoreLoggerExtensions.LazyLoadOnDisposedContextWarning(IDiagnosticsLogger`1 diagnostics, DbContext context, Object entityType, String navigationName)
       at Microsoft.EntityFrameworkCore.Internal.LazyLoader.ShouldLoad(Object entity, String navigationName, NavigationEntry& navigationEntry)
       at Microsoft.EntityFrameworkCore.Internal.LazyLoader.Load(Object entity, String navigationName)
       at Microsoft.EntityFrameworkCore.Proxies.Internal.LazyLoadingInterceptor.Intercept(IInvocation invocation)
       at Castle.DynamicProxy.AbstractInvocation.Proceed()
       at Castle.Proxies.RecurringInvoiceTemplateProxy.get_Company()
       at SourceLine.Api.Services.InvoicingService.<>c__DisplayClass48_0.<GenerateRecurringInvoicesAsync>b__0(CustomerDto x) in 1299
       at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Func`2 predicate, Boolean& found)
       at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
       at SourceLine.Api.Services.InvoicingService.<GenerateRecurringInvoicesAsync>d__48.MoveNext() in line 1299
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Threading.ThreadPoolWorkQueue.Dispatch()
    

    我的问题

     return dbContext.RecurringInvoiceTemplates.Include(x => x.Company)
                                                  .Include(x => x.RecurringInvoiceFrequency)
                                                  .Where(x => x.NextRun.Date.CompareTo(currentTime.Date) <= 0).ToList();
    

    它死在哪里

        foreach (var r in recurringInvoices){
         var foundCustomer = allCustomers.FirstOrDefault(x => x.Id == r.Company.Identifier);
    }
    

    更新

    问题可能就是因为这个

    public async void Get(){
    
        var recurringInvoices = dbContext.RecurringInvoiceTemplates.Include(x => x.Company)
                                                      .Include(x => x.RecurringInvoiceFrequency)
                                                      .Where(x => 
        var allCustomer = new List<Dto>(){
            new Dto(){
                Id = 1
            }
        }
    
        foreach (var r in recurringInvoices)
        {
            //allcustomers is not en EF object, just a dto.
            var foundCustomer = allCustomers.FirstOrDefault(x => x.Id == r.Company.Identifier);
    
            if (foundCustomer != null)
            {
    
                    var ApiKey = configuration["SendGrid:Key"];
                    var sendGridClient = new SendGridClient(ApiKey);
    
                    var msg = new SendGridMessage();
                    msg.SetFrom(new EmailAddress("example@test.com, "Example User"));
    
    
                    msg.SetTemplateId("d-f06bfad7374b4a3cb2ccbf846d8e96a4");
    
    
                    var dynamicTemplateData = new SendInvoiceTemplateDto
                    {
                        Subject = "a",
                        Body = "b"
                    };
    
                    msg.SetTemplateData(dynamicTemplateData);
    
                    var response = await sendGridClient.SendEmailAsync(msg);
                }
            }
    }
    

    编辑2

    我不明白但是当我使用

     var response = sendGridClient.SendEmailAsync(msg);
    response.Wait();
    

    0 回复  |  直到 6 年前
        1
  •  6
  •   Stephen Cleary    6 年前

    既然我使用的是async,那么它会处理我的dbContext吗?

    async void . 你应该 avoid async void . 问题之一是 异步无效 那是那个吗 那种方法 不知道 当它完成时。因此,调用者只是继续执行,最终完成HTTP请求并拆掉控制器(以及任何注入依赖项的东西),处理 DbContext 造成这种例外是因为 .

    异步无效 async Task 让打电话的人 await Task 从返回 Get . 如果 得到 异步无效 ; ASP.NET将自动处理 正确地。