实体框架的核心 - 产品类型的相关产品

问题描述 投票:0回答:1

我使用实体框架的核心和流利的API。

我试图执行包含在我的产品型号,像这样一个relatedProducts阵列:

{
    "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阵列刚刚传来即使我已经在数据库连接起来的ID空空的回来。

在这个任何援助将是真棒,因为我不想落得“Bodging”了!

asp.net-core entity-framework-core ef-fluent-api
1个回答
2
投票

你必须Include相关产品(除非Lazy Loading启用),而您要查询。所以,你可以让你的查询关键词,比如,如下所示:

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);
© www.soinside.com 2019 - 2024. All rights reserved.