我使用的是.NET Core 2.0。我写了很多导航属性,我知道目前不支持EF Core上的自动延迟加载。我使用Microsoft方法来创建导航属性。我试图建立一个多对多的关系。
首先创建手动映射表,该表也包含在ApplicationDbContext中,如新的DbSet
public class ProductCategory
{
[Key]
public int ProductId { get; set; }
[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
[Key]
public int CategoryId { get; set; }
[ForeignKey("CategoryId")]
public virtual Category Category { get; set; }
}
public class Product
{
public int Id { get; set; }
public virtual ICollection<ProductCategory> ProductCategory { get; set;
}
public class Category
{
public int Id { get; set; }
public virtual ICollection<ProductCategory> ProductCategory { get; set;
}
在OnModelCreating类
中 builder.Entity<ProductCategory>()
.HasKey(x => new { x.CategoryId, x.ProductId });
builder.Entity<ProductCategory>()
.HasOne(x => x.Product)
.WithMany(x => x.ProductCategory)
.HasForeignKey(x => x.ProductId);
builder.Entity<ProductCategory>()
.HasOne(x => x.Category)
.WithMany(x => x.ProductCategory)
.HasForeignKey(x => x.CategoryId);
在映射表中添加新对象时。
var productCategory = new ProductCategory
{
CategoryId = 1,
ProductId = 1
};
db.ProductCategory.Add(productCategory);
db.SaveChanges();
项目成功添加,之后尝试访问产品或类别以测试导航属性,但只接收映射表中的当前类。当我尝试从类别类访问产品时,您可以看到示例:
model.Categories = this._categoryService
.All()
.Include(x => x.ProductCategory)
.ToList();
产品类是否为空?
答案 0 :(得分:2)
这是因为包含导航属性会自动包含反向导航属性,但仅此而已。您需要使用ThenInclude
专门询问。
假设All
方法返回IQueryable<Category>
,如下所示:
model.Categories = this._categoryService
.All()
.Include(x => x.ProductCategory)
.ThenInclude(x => x.Product)
.ToList();
请注意,这也会自动包含(加载)ProductCategory
实体的Product
集合属性。