【问题标题】:ASP NET Core crashing when using eager load with Entity Framework使用 Entity Framework 的即时加载时 ASP NET Core 崩溃
【发布时间】:2018-08-15 04:12:45
【问题描述】:

我有一个简单的电话:

 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":[

由于某种原因,Entity 在获取其余数据之前就崩溃了。

当我尝试使用属性时:

[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:“属性“名称”不是实体类型“ApplicantCompany”的导航属性。 'Include(string)' 方法只能与 '.' 一起使用。导航属性名称的分隔列表。'

但是属性存在...

【问题讨论】:

  • 你遇到异常了吗?
  • 如果 Name 只是一个字符串,你不包括它,你只包括 CreditorCompany
  • 能否提供Applications背后的模型?
  • 你不应该使用.Include(a=> a.AplicantCompany.Name)Include用于a navigation property,这是不同模型之间的关系,而不是像public string Name { get; set; }这样的自属性。您似乎一直在尝试加载 Applications 的所有属性。如果你在return Ok(result); 上设置一个断点,你会看到预期的Applications 吗?请注意,您需要将IActionResult 更改为async Task<IActionResult> 并将context.Applications.Include 更改为await context.。您从哪里得到损坏的结果?尝试邮递员发送请求。

标签: c# entity-framework asp.net-core


【解决方案1】:

您对ToListAsync() 的调用返回一个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)

其实按照this answer,你或许可以做到(我没试过):

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

【讨论】:

  • 我不认为你可以这样做,我很确定你必须在Include 中加载整个实体。如果Name是另一个实体,你可以做.Include(a =&gt; a.AplicantCompany).ThenInclude(c =&gt; c.Name)
  • 已经试过了。它说“名称”不是“ApplicantCompany”的属性。但确实如此。
【解决方案2】:

首先,

Include() 方法用于加载相关数据,而不是相关数据的属性。 这意味着,要在实体 Applications 上加载相关 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);
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 可能是视觉所做的一些“更正”......无论如何,我更改为列出并收到此错误:System.InvalidOperationException:'属性'名称'不是实体类型的导航属性'申请人公司”。 'Include(string)' 方法只能与 '.' 一起使用。导航属性名称的分隔列表。重点是:属性存在!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2018-06-21
    • 2017-02-28
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多