Entity Framework 核心未加载 1 到 0 外键实体
Entity Framework Core not loading 1 to 0 foreign key entity
我有三个简单的实体 - 购物篮、产品 和 购物篮商品。
因此,通过 BasketItem 将 Product 添加到 Basket。每个 BasketItem 必须 连接到一个产品和一个购物篮,但是一个产品 不必 连接到一个 BasketItem(即还没有添加到任何篮子)。
Basket 和 BasketItem 具有 1-many 关系,而 BasketItem 和 Product 具有 1-0 关系,这意味着 Product 可以在 Basket 中(通过 BasketItem),但不一定是。
我已经以常规方式设置了一个 DbContext,一切正常,除了当通过 BasketItem 访问时产品实体为空,即 entity framework 根本不加载它。例如
basket.BasketItems.FirstOrDefault().Product 给出空值。
我已经谷歌搜索了几个小时,但找不到解决方案。我还尝试了以下几种变体:
builder.Entity<BasketItem>().HasOne(p => p.Product);
但 none 有效。
代码如下:
public class Basket
{
[Key]
public int ID { get; set; }
public ICollection<BasketItem> BasketItems { get; set; } = new List<BasketItem>();
}
}
public class BasketItem
{
public int ID { get; set; }
public int ProductID { get; set; }
[ForeignKey("ProductID")]
public virtual Product Product { get; set; }
public int BasketID { get; set; }
[ForeignKey("BasketID")]
public virtual Basket Basket { get; set; }
public int ProductQuantity { get; set; }
}
public class Product
{
public int ID { get; set; }
[Required]
public string ProductName { get; set; }
public string Description { get; set; }
public double Price { get; set; }
}
在我的上下文中设置:
builder.Entity<Product>().HasData(new Product() { ID = 1, ProductName = "Harry Potter hardback collection", Description = "All 7 Harry Potter books in hardback.", Price = 150.00 });
...
builder.Entity<Basket>().HasData(new Basket() { ID = 1, BasketTotalPrice = 750 });
builder.Entity<BasketItem>().HasOne(p => p.Product);
builder.Entity<BasketItem>().HasData(new BasketItem() { ID = 1, BasketID = 1, ProductID = 1, ProductQuantity = 2 });
Loading Related Data 文档部分。
您将不得不使用 Include()
方法
如评论中所述,您必须先 Include()
BasketItmens。 ThenInclude()
产品。
所以在你的情况下,解决方案是
context.Basket.Include(b => b.BasketItems).ThenInclude(bi => bi.Product).FirstOrDefault().Product
我有三个简单的实体 - 购物篮、产品 和 购物篮商品。 因此,通过 BasketItem 将 Product 添加到 Basket。每个 BasketItem 必须 连接到一个产品和一个购物篮,但是一个产品 不必 连接到一个 BasketItem(即还没有添加到任何篮子)。
Basket 和 BasketItem 具有 1-many 关系,而 BasketItem 和 Product 具有 1-0 关系,这意味着 Product 可以在 Basket 中(通过 BasketItem),但不一定是。
我已经以常规方式设置了一个 DbContext,一切正常,除了当通过 BasketItem 访问时产品实体为空,即 entity framework 根本不加载它。例如
basket.BasketItems.FirstOrDefault().Product 给出空值。
我已经谷歌搜索了几个小时,但找不到解决方案。我还尝试了以下几种变体:
builder.Entity<BasketItem>().HasOne(p => p.Product);
但 none 有效。 代码如下:
public class Basket
{
[Key]
public int ID { get; set; }
public ICollection<BasketItem> BasketItems { get; set; } = new List<BasketItem>();
}
}
public class BasketItem
{
public int ID { get; set; }
public int ProductID { get; set; }
[ForeignKey("ProductID")]
public virtual Product Product { get; set; }
public int BasketID { get; set; }
[ForeignKey("BasketID")]
public virtual Basket Basket { get; set; }
public int ProductQuantity { get; set; }
}
public class Product
{
public int ID { get; set; }
[Required]
public string ProductName { get; set; }
public string Description { get; set; }
public double Price { get; set; }
}
在我的上下文中设置:
builder.Entity<Product>().HasData(new Product() { ID = 1, ProductName = "Harry Potter hardback collection", Description = "All 7 Harry Potter books in hardback.", Price = 150.00 });
...
builder.Entity<Basket>().HasData(new Basket() { ID = 1, BasketTotalPrice = 750 });
builder.Entity<BasketItem>().HasOne(p => p.Product);
builder.Entity<BasketItem>().HasData(new BasketItem() { ID = 1, BasketID = 1, ProductID = 1, ProductQuantity = 2 });
Loading Related Data 文档部分。
您将不得不使用 Include()
方法
如评论中所述,您必须先 Include()
BasketItmens。 ThenInclude()
产品。
所以在你的情况下,解决方案是
context.Basket.Include(b => b.BasketItems).ThenInclude(bi => bi.Product).FirstOrDefault().Product