私はEntity Framework CoreとFluent 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; }
}
問題は、db内のIDをリンクしていても、relatedProduct配列が空に戻ってきたことです。
私はそれを '宿泊'に終わらせたくないので、これに関する任意の支援は素晴らしいでしょう!
照会している間は、( 遅延読み込みが有効になっていない限り)関連商品を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);