実践 Entity Framework ~ ForeignKey 属性
Entity Framework で Code First Migrations。
前回、外部キーをナビゲーションプロパティを追加することで、外部キーを設定してみました。ただし、この方法だけの場合、制約の為プロパティ名が制限されてしまう問題があります。
ForeignKey 属性を利用する
命名規約だけではどうしようもない...そんな時に登場するのが属性です。
どんな属性が...と、そのまんまの「ForeignKey」属性があります。これを利用してみます。
前回利用したMinicipality エンティティクラスで外部キーとなっていた PrefectureCode を PCD に変更してみます。
public class Municipality { [Key] [MaxLength(6)] public string Code { get; set; } [MaxLength(5)] public string PCD { get; set; } // これを変更 [MaxLength(20)] public string Name { get; set; } [MaxLength(40)] public string Kana { get; set; } public Prefecture Prefecture { get; set; } // ナビゲーションプロパティ }
このままでは、PCDは外部キーとはなりません。そこで、ForeignKey 属性を付与してみます。
何処につけるのか...答えはナビゲーションプロパティです。
[ForeignKey("PCD")] public Prefecture Prefecture { get; set; }
ForeignKey 属性の引数には、外部キーとなるプロパティ名を指定します。
Add-Migrationしてみると...
CreateTable( "dbo.Municipalities", c => new { Code = c.String(nullable: false, maxLength: 6), PCD = c.String(maxLength: 5), Name = c.String(maxLength: 20), Kana = c.String(maxLength: 40), }) .PrimaryKey(t => t.Code) .ForeignKey("dbo.Prefectures", t => t.PCD) .Index(t => t.PCD); ... 以下略
ちゃんとできたっぽいです。
外部キーが目的ではない?
そもそも、ナビゲーションプロパティと呼ばれる、Prefecture プロパティってなんでしょう?外部キーを設定するためのもの?
いやいや、そんなことはありません。コードでリレーションシップを取り扱うにあたり、このナビゲーションプロパティが非常に重要になってきます。
あるテーブルから別の関連テーブルへのアクセスを容易にする...まとめてデータを取得する...時と場合により重宝するときも無駄となるときもありますが...
このナビゲーションプロパティについて、つづきはこちらで...