インクリメンタルなカイハツにっき

.NET 開発手法を中心に、これから始める方の一助となる記事を載せていく予定です。

実践 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 プロパティってなんでしょう?外部キーを設定するためのもの?
いやいや、そんなことはありません。コードでリレーションシップを取り扱うにあたり、このナビゲーションプロパティが非常に重要になってきます。
あるテーブルから別の関連テーブルへのアクセスを容易にする...まとめてデータを取得する...時と場合により重宝するときも無駄となるときもありますが...

このナビゲーションプロパティについて、つづきはこちらで...