Entity Framework Core - связанные продукты типа продукта - PullRequest
0 голосов
/ 05 февраля 2019

Я использую Entity Framework Core и Fluent API.

Я пытаюсь реализовать массив связанных продуктов, который включен в мою модель продукта, например:

{
    "id": 13
    "name": "something",
    "heading": "something else",
    "summary": "please put me out my misery!"
    "relatedProducts": [
        {
            "name": "something related",
            "heading": "something else related",
            "summary": "something in summary"
        },
        {
            "name": "something related",
            "heading": "something else related",
            "summary": "something in summary"
        }
    ]
}

Я в настоящее времяимейте это в моем контексте:

        modelBuilder.Entity<RelatedProduct>()
            .HasKey(r => new { r.ProductId, r.RelatedId });

        modelBuilder.Entity<RelatedProduct>()
            .HasOne(p => p.Product)
            .WithMany(r => r.RelatedProducts)
            .HasForeignKey(p => p.ProductId)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<RelatedProduct>()
            .HasOne(p => p.Related)
            .WithMany(r => r.ProductsRelated)
            .HasForeignKey(p => p.RelatedId)
            .OnDelete(DeleteBehavior.Restrict);

Мой класс связанных продуктов выглядит следующим образом:

public class RelatedProduct
{
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }

    public int RelatedId { get; set; }
    public virtual Product Related { get; set; }
}

Проблема в том, что мой массив relatedProduct просто возвращается пустым, даже если я подключилсяИдентификаторы в БД.

Любая помощь по этому вопросу была бы потрясающей, так как я не хочу в конечном итоге 'Bodging' это!

1 Ответ

0 голосов
/ 05 февраля 2019

Вы должны Include связанные продукты (если Ленивая загрузка включена) во время запроса.Таким образом, вы можете сделать ваш запрос следующим образом:

var product = _dbContext.Products.Include(p => p.RelatedProducts)
                                .ThenInclude(rp => rp.Related)
                                .FirstOrDefault(p => p.Id == productId);

Теперь ваш желаемый продукт будет иметь связанные продукты.

Лучше проектируйте ваш запрос следующим образом:

var product = _dbContext.Products.Select(p => new
            {
                p.Id,
                p.Name,
                p.Heading,
                p.Summary
                RelatedProducts = u.RelatedProducts.Select(rp => rp.Related).ToList()
            }).FirstOrDefault(p => p.Id == productId);

Здесь product является анонимным типом.Если вы хотите, вы можете сделать его строго типизированным, проецируя запрос на ViewModel следующим образом:

public class ProductDetailsViewModel
{
   public int Id {get; set;}
   public string Name {get; set;}
   public string Heading {get; set;}
   public string Summary  {get; set;}

   public List<Product> RelatedProducts {get; set;}
}

Затем в запросе:

var product = _dbContext.Products.Select(p => new ProductDetailsViewModel
                {
                    Id =p.Id,
                    Name = p.Name,
                    Heading = p.Heading,
                    Summary = p.Summary
                    RelatedProducts = p.RelatedProducts.Select(rp => rp.Related).ToList()
                }).FirstOrDefault(p => p.Id == productId);
...