【问题标题】:EF Core explicit ignore relationEF Core 显式忽略关系
【发布时间】:2019-01-16 14:42:26
【问题描述】:
public class Unit
{
   Public int Id { get; set; }
   Public virtual ICollection<Element> Elements { get; set; }
}

public class Element
{
   public int Id { get; set; }
   public virtual Unit Unit { get; set; } 
}

我们使用 API 调用来获取所有 Elements 和相关的 Units。 像这样:

Context.Elements.Include(o => o.Unit);

我们的预期是只有Elements 会有Unit。但是Units 也有Elements

{
  "Id": 1,
  "Unit": {
     "Id": 1,
     "Elements":[...]
  }
}

我们如何从Unit.Elements 中排除Elements?

【问题讨论】:

  • 1 个单元可以有 0 个或多个元素。但是一个元素必须有一个单元才能存在/被创建。您不能从单元中排除元素。这就是它的工作原理

标签: asp.net-core .net-core entity-framework-core asp.net-core-webapi


【解决方案1】:

如果相关实体已加载到内存中,EF Core 会填充实体的导航属性。

Context.Element.Include(e => e.Unit) 

上面的行将加载内存中的所有Element 实体,因此它也会填充Unit.Elements

Entity Framework Core 将自动修复导航属性 到之前加载到上下文中的任何其他实体 实例。因此,即使您没有明确包含 导航属性,如果某些或 所有相关实体之前都已加载。

EF Core 2.1 现在支持延迟加载,这可能可以回答您的问题,但是,正如我上面提到的,在您的情况下,所有 Elements 都已加载到内存中。

Loading Related Data - Lazing Loading

【讨论】:

    【解决方案2】:

    目前没有解决方案。

    正如here 所指出的,有一个可用的解决方法:

    Context.Elements.Include(o => o.Unit).Select(o => new Element()
    {
      Id = o.Id,
      Unit = o.Unit
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-05
      • 2021-12-26
      • 2018-10-22
      • 1970-01-01
      • 2021-05-20
      • 2022-01-25
      • 1970-01-01
      • 2022-10-20
      相关资源
      最近更新 更多