EntityFramwork -> 外部キー
【環境】
Visual C#: 15.5.4(2017)
Visual C#: 15.5.4(2017)
単一
自動
php フレームワークみたいに、
命名規則を守って記述すれば
自動で外部キー設定をしてもらえる。
public class Municipality
{
[Key]
[MaxLength(6)]
public string Code { get; set; }
[MaxLength(5)]
public string PrefectureCode { get; set; }
public Prefecture Prefecture { get; set; } // 追加分
}
こちらは、参考サイトのものを一部頂戴してきたソース。
手動
命名規則からハズレた場合には
手動で外部キーを設定してやる。
public class Municipality
{
[Key]
[MaxLength(6)]
public string Code { get; set; }
[MaxLength(5)]
public string PCD { get; set; } // これを変更
[ForeignKey("PCD")]
public Prefecture Prefecture { get; set; } // ナビゲーションプロパティ
}
こちらも参考サイトのものを一部頂戴。
Eager-loding, Lazy-loading
おそらく、この先で Eager-loding, Lazy-loading の勉強をする必要があると思う。
複合キー
外部キー
参考スライドの通り
[Key]
[Column(Order=1)]
public string Value1 { get; set; }
[Key]
[Column(Order=2)]
public string Value2 { get; set; }
としたところ、Add-Migration で、下記エラーが出た。
Entity type ‘HogeEntity’ has composite primary key defined with data annotations. To set composite primary key, use fluent API.
そこで、参考サイトのように、Entity でのキー設定をやめ
DbContext 側で設定したところ、設定できた。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasKey(paidHoliday => new { HogeEntity.Value1, HogeEntity.Value2 });
}
参考サイト
Qiita:[EntityFrameworkCore]CodeFirstでテーブルに複合主キーを付ける(2017-08-31)
→参考スライドの [Column(Order=1)] では設定できなかったので、大変助かりました
利用
上記のように設定しておけば、Join しなくても
オブジェクトチェーンで取得可能。
Municipality.Code
Municipality.Prefecture.Code
参考サイト
インクリメンタルなカイハツにっき
実践 Entity Framework ~ 外部キーを設定する(2015-07-28)
実践 Entity Framework ~ ForeignKey 属性(2015-08-03)