Entity Framework Core не загружает от 1 до 0 внешнего ключа - PullRequest
0 голосов
/ 15 мая 2019

У меня есть три простых объекта - Корзина , Продукт и BasketItem . Таким образом, продукт добавляется в корзину через BasketItem. Каждый BasketItem должен быть подключен к одному продукту и одной корзине, однако продукт не обязательно должен быть подключен к BasketItem (т.е. еще не добавлен ни в одну корзину).

Basket & BasketItem имеет отношение 1-много, в то время как BasketItem & Product имеет отношение 1-0, что означает, что Product может быть в корзине (через BasketItem), но не обязательно.

Я установил DbContext обычным способом, и все работает нормально, за исключением того, что сущность Product имеет нулевое значение при доступе через BasketItem, то есть структура сущностей не загружает его вообще. Э.Г.

basket.BasketItems.FirstOrDefault (). Продукт дает нулевое значение.

Я часами гуглял и не мог найти решение. Я также попробовал несколько вариантов:

builder.Entity<BasketItem>().HasOne(p => p.Product);

но никто не работал. Код представлен ниже:

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

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Загрузка связанных данных раздел документа.

Вам придется использовать метод Include()

1 голос
/ 16 мая 2019

Как упомянуто в комментарии, вы должны сначала Include() BasketItmens.ThenInclude() Продукты.

Так что в вашем случае решения

context.Basket.Include(b => b.BasketItems).ThenInclude(bi => bi.Product).FirstOrDefault().Product
...