エンティティフレームワークコアの関連エンティティのIDのみを含む

c# entity-framework-core

質問

私は現在、データベースプロバイダーとしてnpgsqlを持つASP.NETコアとEntityフレームワークコアを持つAPIを開発中です。私は2つのエンティティを持ち、1対多の関係を持っています。これは、「親コントローラ」が返すJSON結果に子エンティティの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; }
}

私はしかし、これを達成する方法については確信していません。昨日私は次のような何かを示唆した別のSOの質問に出くわしました:

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

    return new JsonResult(meal);
}

しかし、これはInvalidOperationExceptionをスローします。私のDbContextは非常に基本的なもので、onModelConfiguringはありません。なぜなら、このコードは私が知っている限りではコンベンションに従っており、対応するタイプの2つのDbSetsしかないからです。外部キーもデータベースで正しいですし、次のようなものを呼び出します。

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

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

あなたの時間をありがとう!

受け入れられた回答

あなたはあなたのDB構造を変更する必要はありません、1つのオプションはそうです:

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

あなたはラムダを使って同じことを "Select"メソッドを使って行うこともできますが、Linqは私には直感的に思えますが、あなた自身の選択に応じます。


人気のある回答

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

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



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ