我正在使用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
中的正确扩展方法。
答案 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; }
}