
HasKeyメソッドで複合キーを設定する方法【Entity Framework Core C#】
Entity Framework Core(EF Core)を使っているときに
複合キーを設定できずに困ったことはないでしょうか。
本記事はEF Core系で複合キーつまり、複数のプライマリーキーを持つテーブルへの対応するための記事です。
EF Coreで複合キーを設定する方法と何故その方法をとらないといけないかについて紹介します。
目次
HasKeyメソッドで複合キーを設定
解決策から行きましょう。
- DbContextのOnModelCreatingメソッドのなかで複合キーを設定する
です。
具体例でみていきます。
次のようなクラスをEF Coreで利用しているとします。
OnModelCreatingメソッドの中に次のように記述をしてあげると
複合キーに対応したテーブルに対応することができます。
HasKeyメソッドを利用することで、プロパティとプライマリーキーをマッピング設定することが可能です。
HasKeyメソッドが必要な理由1:複合キーは暗黙的な解釈がされない
EF Coreでは「Id」もくしは●●Idとついたプロパティがあれば、暗黙的に解釈してくれます。
しかし、複合キーの場合は暗黙的に解釈してくれはしません。
単一のキーの例を見てみましょう。
自動でStudentIdを主キーとして解釈してくれるので、特にプライマリーキーの設定がいりません。
では今回の設定したいこのクラスの場合はどうでしょう。
SchoolIdそしてStudentIdの二つのプロパティとも「Id」があります。
感覚的には複合キーとして解釈してくれそうです。
しかしながら、HasKeyメソッドで明示的に複合キーを設定をしないと次のようにエラーが発生します。
Unhandled exception. System.InvalidOperationException: The entity type ‘StudentGoToSchool’ requires a primary key to be defined.
このように、複数のプロパティ名にIdがあっても複合キーとして機能しないので、
HasKeyメソッドによる設定が必要になるのです。
HasKeyメソッドが必要な理由2:複合キーは属性で設定できない
それならば、Key属性を使えばよいのではないか、という意見もあるかと思います。
そう、明示的にKeyとして指定するは何もHasKeyだけではありません。
明示的なKey指定の方法としてKey属性の利用があります。
Entity Framework 6.0にあるKey属性による複合キーの指定です。
ですが、EF CoreではKey属性による指定は、残念ながらできません。
実際に複数のKey属性を設定してみましょう。
属性をつけるだけはできます。しかし実行時に次のエラーが発生します。
Unhandled exception. System.InvalidOperationException: The entity type ‘StudentGoToSchool’ has multiple properties with the [Key] attribute. Composite primary keys can only be set using ‘HasKey’ in ‘OnModelCreating’.
「複合キーを設定するならOnModelCreatingでHasKeyを利用してね」
です。
このエラーメッセージからもわかるように、
単体の主キーであればKey属性が使えても、複合キーの場合はKey属性を使ったKey指定ができません。
暗黙的なキー設定と一緒ですね。
まとめ
最後に、今回の記事の振り返りです。
- Entity Framework Coreでは複合キーを設定するにはHasKeyメソッドを利用しよう
- プロパティの名前にIdをいれても、Key属性を指定しても複合キーは設定できない
EF Coreではない、Entity Frameworkは開発着手が2008年だそうで、
最も新しいバージョン6.0になった2013年まで精力的に開発されていました。
もうだいぶ昔の話ですね。
EF Coreも2016年から開発されて、現時点で5年と開発期間は同じくらい費やされました。
EF Core 1.0の時には、機能差がかなりあり、以降は難しいと感じたものでしたが、
最新バージョンのEF Coreは十分な機能が追加されてEntity Framework6.0と遜色ない機能があります。
むしろ追加Entity Framework6.0にはない機能も搭載されているくらいです。
しかし、今回紹介した複合キーの設定もそうですが、
中にはまだEntityFramework 6.0の持つ機能をEF Coreが持っていないことがあるのは事実です。
EF Coreはまだまだバージョンしていくことが告知されているので
複合キーは属性で定義できるようになってほしいと、個人的に期待しています。
ただ、現状は機能がないので、複合キーを設定するにはHasKeyメソッドを利用しましょう。
では。