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

わんくま同盟

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

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


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

そもそもの話であれば、主キー以外に外部キー制約を貼るということはあり得ないのでは?

DB 設計に無知な自分が知らないだけという可能性は否定できませんが、Microdoft のドキュメント、

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

の Foreign Key Constraints のセクションに以下の説明があります。

"外部キー参照では、1 つのテーブルの主キー値が格納されている列が別のテーブルの 1 つ以上の列
によって参照されたときに、2 つのテーブル間にリンクが作成されます。 この列は、2 番目のテー
ブルの外部キーになります。"

"In a foreign key reference, a link is created between two tables when the column or columns
that hold the primary key value for one table are referenced by the column or columns in
another table. This column becomes a foreign key in the second table."

外部キーを貼る相手は主キーと読めます。

ということで、質問者さんのコードでナビゲーションプロパティに付与した [ForeignKey("BookCode")] は
無視されて、規約通りに FK 制約が貼られ、

> 上記定義で作成されたテーブルを見るとBookGenre上のBookへのFKはBook.Idに紐づいてしまっています。

という結果にになったように見えます。

> また、世の中のWEB系フレームワーク(?)の主流がサロゲートキーを主キーにすることを推奨(?)しているようなのと、
> 今回使用するEntity Frameworkも書籍やサイト記事でも基本、IDという自動採番のプロパティが主キーになっているのも
> このような定義になった理由の一つです。

EF Code First の規約に従ってそういう結果になっただけで、「推奨」ということではないでしょう。

int 型のプロパティで名前が Id とか クラス名Id の場合は EF Code First の規約によって DB の当該フィールドは int
IDENTITY(1,1) 型の主キーになります。そうならないようにする方法はもちろんあって、どのようにしたいかによって何と
でもできるはずです。

どうしたいのですか?

> Entity Frameworkでは自動採番の主キー以外(外部キー)でのリレーションはあまりにもイレギュラーなんでしょうか?

上の述べたように主キー以外に FK を貼るのはあり得ないと思っているのですけど。

> モデルバインドでBooks.BookGenres.Genresとジャンルが取得できたら便利だなと思いやってみたのですが。

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

返信 編集キー/


管理者用

- Child Tree -