2016-08-04 6 views
3

現在、データベースプロバイダとしてnpgsqlを使用して、ASP.NETコアとEntityフレームワークコアを持つAPIを開発中です。私は2つのエンティティを持ち、1対多の関係を持っています。これは、「親コントローラ」が返すJSON結果に子エンティティのIdだけを含めることです。エンティティフレームワークコアの関連エンティティIDのみを含む

これらは私の実体である:

public class Meal { 
    public int Id { get; set; } 

    public string Title { get; set; } 
    public string Description { get; set; } 

    public string UserId { get; set; } 
    public User User { get; set; } 

    public List<Picture> Pictures { get; set; } 

    public Meal() { 
     this.Pictures = new List<Pictures>(); 
    } 
} 

public class Picture { 
    public int Id { get; set; } 

    public int MealId { get; set; } 
    public Meal Meal { get; set; } 

    public byte[] full { get; set; } 
    public byte[] small { get; set; } 
} 

は、しかし私は、これを実現する方法について確認していません。

public IActionResult Meals() { 
    var meal = this.context.Meals 
     .Include(m => m.Pictures.Select(p => p.Id)) 
     .First(); 

    return new JsonResult(meal); 
} 

これはしかし、InvalidOperationExceptionがスローされますが:昨日、私はこのような何かを示唆した別のSOの質問に出くわしました。 DbContextは非常に基本的ですが、onModelConfiguringはありません。なぜなら、このコードは私が知っている限り、これに準拠しており、対応する型の2つのDbSetsしかないからです。外部キーもデータベースで正しくあり、次のようなものを呼び出します。

var pictures = dbContext.Pictures.Where(p => p.MealId == mealId).ToList(); 

期待どおりに動作します。私は関連性があると思ったコードだけを含んでいます。より多くのものが必要な場合はそれを含めることにしますが、これは完全に私のクエリの制限された理解だと思う。

ありがとうございました!

答えて

1

は、一つの選択肢はそうのようなものですしかし、自分自身にはもっと直感的に見えます...それがあなたの選択です。

+0

これは完璧に見えます。私はそれを元に戻し、明日これを試してみる。ありがとうございました! – larzz11

+0

クール、私はそれが他の人のための答えとしてそれをマークすることを確認するのに役立つ場合、私は他の誰かの時間を浪費しないようにコメントを入れて(私はその権利を知っている)。 –

0

.Include(m => m.Pictures.Select(p => p.Id))あなたは

.Include(m => m.Pictures) 

を行う必要が動作しませんそして、これが(すべてのプロパティID、MealId、...と)とすることができますあなたのクライアント側であなたのためにあなたの全体像モデルの配列を取得します私と一緒に働くためにIDを選んでください。

0

おそらくもっと良い答えがありますが、これは私がそれを修正した方法です。 Pictureクラス全体を含めると、バイナリデータもインクルードされていたため、データベースへの高価な呼び出しであるため、データを使用せずにそのデータをサーバーに問い合わせる必要がないため、オプションではありませんでした。

PictureFileという名前の別のクラスにバイナリデータを入れました(より良い名前を考える必要がありますが、ちょうどFileは明らかにオプションではありませんでした)。クラスPictureFileには、対応するピクチャへの参照とピクチャデータを持つバイト配列があります。そうすればMealPicturesを含めることができ、実際のファイルを入手することはできません。クライアントは、必要な画像を後で決定し、PictureIdによって要求することができます。このようなことに

 var db = this.context; 
     var result = (from meal in db.Meals 
         where meal.<whatever> == "123" 
         select new 
         { 
         Id = meal.Id, 
         Title = meal.Title, 
         Description = meal.Description, 
         //other required meal properties here. 
         PictureIds = meal.Pictures.Select(x => x.Id) 
         }).ToList(); 

あなたが「選択」の方法を使用することにより、同様のラムダを経由して同じことを行うことができ、LINQの:あなたはあなたのDBの構造を変更する必要はありません

関連する問題