实体框架核心-加载子实体

时间:2020-11-08 16:40:42

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

我正在使用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产品过滤的商品,但所有产品的类别均为null。因此,当我将此结果传递给查看并尝试获取类别名称时,我有一个空引用异常。

如何为商品加载类别实体?

UPD:已解决!

我意识到我使用的是.Include而不是System.Data.Entity中的Microsoft.EntityFrameworkCore方法。

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

2 个答案:

答案 0 :(得分:2)

我意识到我使用的是.Include而不是System.Data.Entity中的Microsoft.EntityFrameworkCore方法。

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

答案 1 :(得分:0)

您可以使用此代码

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; }
}