C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■95891 / )  Re[4]: コードファーストで多対多のテーブルをカスタマイズしたい
□投稿者/ じぇい (3回)-(2020/10/07(Wed) 19:00:36)
No95886 (WebSurfer さん) に返信

> 主キー制約と外部キー制約
> https://docs.microsoft.com/ja-jp/sql/relational-databases/tables/primary-and-foreign-key-constraints?view=sql-server-ver15

ありがとうございます。確かに外部キーの「相手」は主キーと読めますね。
となると制約をかけたい方が「自分」となり、そちらは必ずしも主キーじゃなくても良いということでしょうか。

結果、以下のように、Book.BookCodeを主キーにし、BookGenreからBookへの参照を削除することで目的は達成できました。
■Bookモデル
 [Key]
 public int BookCode { get; set; }
 public string BookName { get; set; }

 [ForeignKey("BookCode ")]
 public virtual ICollection<BookGenre> BookGenres { get; set; }

■BookGenreモデル(中間テーブル)
 public int Id { get; set; }
 public int BookCode { get; set; }
 public int GenreId { get; set; }
 public int SortNo { get; set; }

 public virtual Genre Genre { get; set; }


■Genreモデル
 public int Id { get; set; }
 public string GenreName { get; set; }



> どうしたいのですか?

やりたいことは、BookモデルをスキャフォールディングしたDetailビュー側で、

@model NktWeb.Models.Book
<p>@Html.DisplayFor(model => model.BookName)</p>
<table>
@foreach (var item in Model.BookGenres)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Genres.GenreName)
</td>
</tr>
}
</table>

というようにBookに付与されているGenreNameを表示したかっただけです。
ちょっと外部キー制約という内容とはずれていたかもしれません。
極端な話、外部キーの制約自体はアプリ側でチェックを実装するので設定がなくても良いのですが、
上記のようにビュー側でForeachで1対多の”多”の情報を取得する方法が分からず
外部キーの設定であるナビゲーションプロパティを設定しています。

> 意味が分かりません。今のまま、Book.Id に FK を貼っても何の不都合もないと思いますけど。何を考えて
> いるのでしょう?

あくまでBook.Idは連番の主キー、Book.BookCodeをリレーションのキーにしたいという前提のお話でした。
ですので、仰る通り上記のBookCodeを主キーにする形でも大丈夫ではあります。


経験が浅く、こう、と言ったやり方を持っておらず、模索しながらなのでうまく説明できてないかもしれませんが、
「ビュー側でForeachで1対多の”多”の情報を取得する」
というのが今回の目的です。
ナビゲーションプロパティ設定無し(できれば設定したくないので)で可能なのでしょうか?

返信 編集キー/


管理者用

- Child Tree -