Entity Framework 7を使用した多対多オブジェクトの取得

c# entity-framework entity-framework-core

質問

ここでは、データベースダイアグラムで示す多対多の関係の設定を示します。 ここに画像の説明を入力

これらは、次のPOCOクラスによって表されます。これらのクラスから、Entity Frameworkコードを使用してデータベースが最初に作成されました。

public class ExerciseCategory
{
    public int ExerciseId { get; set; }
    public Exercise Exercise { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

public class Exercise
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<ExerciseCategory> ExerciseCategories  { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<ExerciseCategory> ExerciseCategories { get; set; }
}

今私は彼らが属しているカテゴリのリストを含むすべての練習を取得する必要があります。それは多対多の関係であるため、1つのエクササイズは多くのカテゴリを持つことができます。私は次のコードを試した:

_context.Exercises
            .Include(e => e.ExerciseCategories)
            .OrderBy(e => e.Name).ToList();

しかし、それはExerciseCategoryのプロパティを設定しません...

ExerciseCategoryのCategoryプロパティに値が設定されるようにクエリを構成するにはどうすればよいですか? 1つのページに複数の演習が表示される可能性があり、パフォーマンスが問題になる可能性があるため、「for」ループ内ではなく、1つのクエリで優先してください。

人気のある回答

Entity Framework 7の多対多サポートはまだ完全ではありません。現在、 ExerciseCategoryエンティティに対して手動で一対多の関係をマップする必要があります。エンティティクラスが正しく設定されています。 DbContextクラスのOnModelCreatingメソッドをオーバーライドする必要があります。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ExerciseCategory>()
        .HasKey(t => new { t.ExerciseId, t.CategoryId });

    modelBuilder.Entity<ExerciseCategory>()
        .HasOne(pt => pt.Exercise)
        .WithMany(p => p.ExerciseCategories)
        .HasForeignKey(pt => pt.ExerciseId);

    modelBuilder.Entity<ExerciseCategory>()
        .HasOne(pt => pt.Category)
        .WithMany(t => t.ExerciseCategories)
        .HasForeignKey(pt => pt.CategoryId);
}

リレーションシップ - Entity Framework 7.0ドキュメントを参照してください。

また、 DbSet<ExerciseCategory>プロパティをコンテキストに含めるようにしてください。

この後、完全な熱心なクエリを以下のように構築することができます:

_context.ExerciseCategories.Include(ec => ec.Exercise)
                    .Include(ec => ec.Category)
                    .Select(ec => ec.Exercise)

またはExercise-queryでThenIncludeを使用して:

_context.Exercises.Include(e => e.ExerciseCategories)
                  .ThenInclude(ec => ec.Category)


Related

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