【问题标题】:Entity Framework Core - load child entityEntity Framework Core - 加载子实体
【发布时间】:2023-03-29 07:39:01
【问题描述】:

我正在使用 EF Core,但遇到延迟加载问题。

我的模型是:

public class Product
{
  public int Id{get; set;}
  public string Name {get; set;}
  public virtual Category Category {get; set;}
}

public class Category
{
  public int Id{get; set;}
  public string Name {get; set;}
}

获取产品的代码:

List<int> selectedCategories = new List<int> { 1, 2 };

// DatabaseContext inherited from DbContext
// Products is of type DbSet<Product>
IQueryable<Product> query = _dbContext.Products.Include(p=>p.Category);
IQueryable<Product> filtered = query.Where(p => selectedCategories.Contains(p.Category.Id));
var result = filtered.ToList();

问题是:filtered 列表包含真正按类别 ID 过滤的产品,但所有产品的类别均为空。因此,当我将此结果传递给查看并尝试获取类别名称时,我有一个空引用异常。

如何使用 Product 加载 Category 实体?

UPD:已解决!

我意识到我使用了来自System.Data.Entity 的错误.Include 方法,而不是Microsoft.EntityFrameworkCore

因此,如果您遇到同样的问题,请检查您是否使用了来自 Microsoft.EntityFrameworkCore 的正确扩展方法。

【问题讨论】:

  • 啊,我看到你已经解决了你的问题。请使用答案按钮发布正确的“答案”,这样每个读者都可以清楚地看到这个问题已经解决了。
  • 如果不修复课程,您的问题将无法解决,因为您的 EF 有错误

标签: c# entity-framework-core lazy-loading


【解决方案1】:

我意识到我使用了来自System.Data.Entity 的错误.Include 方法,而不是Microsoft.EntityFrameworkCore

因此,如果您遇到同样的问题,请检查您是否使用了来自 Microsoft.EntityFrameworkCore 的正确扩展方法。

【讨论】:

  • 它将在计算机内存中作为一个坏例子工作,但您无法将其保存到数据库
  • 产品应该有一个外键 CategoryId 来提供两个类之间的链接。
  • @Sergey 如您所见,我使用了错误的 Include 方法。我尝试添加 CategoryId 并没有帮助。另外我应该说将对象保存到数据库与这篇文章无关。所以,你是对的,如果我想保存这个模型,我需要 CategoryId,但这不是所描述问题的解决方案。
  • 即使您的解决方案是用于学习并且不会在真正的 EF 环境中工作,这也不是最佳解决方案。你不需要两个查询。一个查询就足够了。
  • @Sergey 正如我所说,这只是一个为清晰理解而创建的示例。真实模型和过滤要复杂得多。
【解决方案2】:

您可以使用此代码

var  filtered = _dbContext.Products
    .Include(p => p.Category) // maybe you don't need this
    .Where(p => selectedCategories.Contains(p.CategoryId))
    .ToList();

但是您的产品有错误。它应该有一个外键 CategoryId 来提供两个类之间的链接。

public class Product
{
    public int Id { get; set; }
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public virtual Category Category { get; set; }
}

【讨论】:

  • 不,不应该。无论如何,这只是一个例子,没关系。检查最后的帖子更新。
  • 它将在计算机内存中作为一个坏例子工作,但您无法将其保存到数据库中
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2017-02-28
  • 2016-10-10
相关资源
最近更新 更多