繁体   English   中英

在实体框架中使用紧急加载时,ASP NET Core崩溃

[英]ASP NET Core crashing when using eager load with Entity Framework

我有一个简单的电话:

 public IActionResult GetApplications()
 {
        var result = context.Applications.Include(a=> a.AplicantCompany)
            .Include(c=>c.CreditorCompany)
            .ToList();
        return Ok(result);
 }

哪个返回:

{"result":[{"context":null,"applicationId":1003,"aplicantCompany":{"id":1,"creditCompid":12344,"name":"Kibon","industry":"ice cream","address":"RaiboW street","city":"Rio de Janeiro","province":"Rio de Janeiro","country":"Brazil","postalCode":"9034-394","style":"modern","yearsStablished":100,"numEmployees":600,"salesAnnual":"12343434","taxId":323,"functionOfScore":12,"dateCreated":"2018-08-09T14:14:38.3325627"},"applicantCompanyID":1,"creditRequested":33333,"creditTerm":1,"processStatus":1,"recommendation":1,"approved":true,"creditApproved":1200000,"dateCreated":"2018-08-09T14:18:32.900369","dateProcessed":"2018-12-12T00:00:00","creditorCompanyId":1,"creditorCompany":{"creditorCompanyId":1,"name":"IBM","address":"boulevard of dreams","city":"Toronto","province":"ON","country":"Canada","postalCode":"M1t 2t5","revenue":12343,"riskPreference":23,"creditLimit":123,"portofolioScore":5.5,"userName":"Ronald","password":"1234","dateCreated":"2018-08-09T12:09:18.0977008","applications":[

由于某种原因,实体在获取其余数据之前就中断了。

当我尝试使用属性时:

[HttpGet("/api/applications")]
public IActionResult GetApplications()
{
    var result = context.Applications.Include(a=> a.AplicantCompany.Name)
                .Include(c=>c.CreditorCompany.Name)
                .ToListAsync();
    return Ok(result);
}

我什么也没收到。 有人知道发生了什么吗?

注意:我现在收到此错误:

System.InvalidOperationException:'属性'Name'不是实体类型'ApplicantCompany'的导航属性。 “ include(string)”方法只能与“。”一起使用。 导航属性名称的分隔列表。”

但是财产存在...

您对ToListAsync()调用返回一个Task ,到您从该方法返回时,该Task可能尚未完成执行。 最好的解决方案是使方法异步,如下所示:

public async Task<IActionResult> GetApplications()
{
   var result = await context.Applications.Include(a=> a.AplicantCompany)
      .Include(c=>c.CreditorCompany)
      .ToListAsync();
   return Ok(result);
}

这些更改将导致该方法在继续return语句之前等待所有结果,同时允许其他请求在等待数据时运行。

第二种情况可能不起作用,因为EF希望使用Include加载整个实体。 如果要加载AplicantCompany引用的另一个实体,则可以使用

.Include(a => a.AplicantCompany).ThenInclude(c => c.Entity)

实际上,根据此答案 ,您可能可以做到(我没有尝试过):

var result = await context.Applications.Select(a => new {
    Application = a,
    CreditorCompany = a.CreditorCompany.Name,
    ApplicantCompany = a.AplicantCompany.Name}).ToListAsync();

首先,

Include()方法用于加载相关数据,而不是相关数据的属性。 这意味着,要在实体“应用程序”上加载相关的AplicantCompany和CreditorCompany的name属性,您的第一个查询是正确的。 它将包括两个相关实体的名称属性

var result = context.Applications.Include(a=> a.AplicantCompany)
                .Include(c=>c.CreditorCompany)
                .ToList();

其次,如果您使用的是异步方法ToListAsync(),则需要等待任务

[HttpGet("/api/applications")]
public async Task<IActionResult> GetApplications()
{
    var result = await context.Applications.Include(a=> a.AplicantCompany)
                .Include(c=>c.CreditorCompany)
                .ToListAsync();
    return Ok(result);
}

您对ToListAsync调用是异步的; 但是调用和方法本身是同步的。 更改为ToList()或(更好)使其他所有内容也异步

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM