Entity Framework Coreでクラスをメンバとして扱う方法
2020-02-26
azblob://2022/11/11/eyecatch/2020-02-26-entityframework-core-owned-000.jpg

こんにちは、花粉に悩まされてる石川です。

備忘録程度ですがハマったことがあったので記事にします。

Code First Migrationに失敗する

以下のクラスでテーブルを立てようとしました。

public class Person
{
  public int Id { get; set; }
  public GeoCoordinate Position { get; set; }
}

public class GeoCoordinate
{
  public double Latitude { get; set; }
  public double Longitude { get; set; }
}

理想としては

カラム名
Idint
Position_Latitude double
Position_Longitudedouble

のようなテーブルが立ち上がってほしいんですが………

> Add-Migration init
The entity type 'GeoCoordinate' requires a primary key to be defined.

困りました。

何が起きているのか

  1. GeoCoordinateを外部キーとして認識
  2. テーブルを作ろうとする
  3. GeoCoordinateに[Key]属性がないので主キーが見つからないとエラーが出る

PersonクラスでGeoCoordinateをナビゲーションプロパティとして認識して外部キー制約を作ろうとして失敗しているようです。(たぶん)

どうすればいいのか

GeoCoordinateクラスに属性を一つ付加するだけで解決します。

[Owned]
public class GeoCoordinate
{
  public double Latitude { get; set; }
  public double Longitude { get; set; }
}

できました。

おわり。

※この記事はQiitaに投降したものを再編集したものです。