多対多こんにちは、あおいです。Coreでリレーションシップを設定するとき、設定方法がよく分からず詰まってしまう方がいらっしゃると思います。Coreで1対1・1対多・多対多の各リレーションシップの設定方法を紹介したいと思います。1対1以下のBookテーブルとAuthorテーブルで、1冊の書籍に1人の著者が紐づいていると仮定します。複数人の著者のケースもありますが、今回は一旦スルーとしておきます。}}まず、各テーブルにナビゲーションプロパティと外部キーを記述します。}}次に、DbContext.csのOnModelCreatingで、FluentAPIを使ってリレーションシップを設定します。こちらのFluentAPIの部分で混乱してしまう方がいらっしゃると思いますが、次のように置き換えて考えてみてください。1modelBuilder.Entity<T>・・・ジェネリック型に親テーブルとなるBookを設定する。a.Book)・・・著者は1冊の書籍を執筆している。4HasForeignKey<T>・・・ジェネリック型に外部キーを保持するAuthorを設定する。以下のCompanyテーブルとEmployeeテーブルで、1つの会社に複数人の会社員が紐づいていると仮定します。}}まず、各テーブルにナビゲーションプロパティと外部キーを記述します。1つの会社には複数人の会社員が存在するので、CompanyクラスのナビゲーションプロパティをICollection型にします。}}次に、DbContext.csのOnModelCreatingで、FluentAPIを使ってリレーションシップを設定します。こちらのFluentAPIの部分で混乱してしまう方がいらっしゃると思いますが、次のように置き換えて考えてみてください。1modelBuilder.Entity<T>・・・ジェネリック型に親テーブルとなるCompanyを設定する。e.Comany)・・・それぞれの会社員は1つの会社に所属している。e.CompanyId)・・・外部キーを指定する。以下のBookテーブルとCategoryテーブルで、1冊の書籍は複数のカテゴリーに表示され、1つのカテゴリーには多数の書籍が含まれていると仮定します。}}多対多のリレーションシップは直接設定することができないので、通常のテーブル設計に倣ってBookCategoryの中間テーブルを追加し、プロパティには各テーブルの主キーとナビゲーションプロパティを記述します。Book・Categoryテーブルにも中間テーブルのBookCategoryに対して、ICollection型のナビゲーションプロパティを設定します。}}次に、DbContext.csのOnModelCreatingで、FluentAPIを使ってリレーションシップを設定します。こちらのFluentAPIの部分で混乱してしまう方がいらっしゃると思いますが、次のように置き換えて考えてみてください。1modelBuilder.Entity<T>・・・ジェネリック型に中間テーブルとなるBookCategoryを設定する。bc.CategoryId})・・・中間テーブルの主キーは、両方の外部キー値で構成される複合主キーとなる。1modelBuilder.Entity<T>・・・ジェネリック型に中間テーブルとなるBookCategoryを設定する。b.BookCategories)・・・1つの書籍は複数のBookCategoryを保持する。bc.BookId)・・・外部キーを設定する。1modelBuilder.Entity<T>・・・ジェネリック型に中間テーブルとなるBookCategoryを設定する。b.BookCategories)・・・1つのカテゴリーは複数のBookCategoryを保持する。bc.CategoryId)・・・外部キーを設定する。bc.CategoryId);}最後に、中間テーブルのBookCategoryをコンテキストに追加します。DBへのデータの挿入・読み取り・更新・削除といった基本的な操作はDbContextを通じて行います。DbContextは内部に挿入や更新を行うオブジェクトの状態を保持しています。Coreでリレーションシップを設定する方法について紹介させていただきました。本記事が少しでも読者の皆様のお役に立てれば幸いです。最新記事あおい「初心者の方にも分かりやすく」をモットーにブログ執筆。本記事に記載の情報に起因するいかなる損害に対しても弊社は一切の責任を負わないものとします。お客様のご判断と責任のもとにご活用ください。