1. ホーム
  2. entity-framework

[解決済み] Code First: 独立した関連付けと外部キーの関連付け?

2022-11-18 16:39:53

質問

新しいプロジェクトに着手し、POCO を設計するたびに、自分自身と心の中で議論しています。私は、多くのチュートリアルやコード サンプルを見てきましたが、これらのチュートリアルでは 外部キーの関連付け :

外部キーの関連付け

public class Order
{
    public int ID { get; set; }
    public int CustomerID { get; set; } // <-- Customer ID
    ...
}

とは対照的に 独立した協会 :

独立した協会

public class Order
{
    public int ID { get; set; }
    public Customer Customer { get; set; } // <-- Customer object
    ...
}

私は過去にNHibernateで作業し、独立した関連付けを使用しました。これはよりOOに感じられるだけでなく、(遅延ロードにより)IDだけでなく、顧客オブジェクト全体にアクセスできるという利点があります。これにより、例えばOrderのインスタンスを取得して Order.Customer.FirstName を実行することができ、非常に便利です。

というわけで、要約すると、私の質問は

  1. 独立した関連付けを使用することに、重大な欠点はありますか。 独立したアソシエーションを使用することに大きな欠点はありますか? そして
  2. もし何もないのであれば、外部キーの関連付けを使用する理由は何でしょうか? は外部キーの関連付けを使用する理由となりますか?

どのように解決するのですか?

ORMをフルに活用したいのであれば、間違いなくEntity referenceを使うでしょう。

public class Order
{
    public int ID { get; set; }
    public Customer Customer { get; set; } // <-- Customer object
    ...
}

FKを持つデータベースからエンティティモデルを生成すると、常にエンティティ参照が生成されます。もしそれらを使用したくない場合は、手動でEDMXファイルを修正し、FKを表すプロパティを追加する必要があります。少なくとも、これは独立した関連付けのみが許可されていたEntity Framework v1の場合でした。

Entity Framework v4 は、外部キー関連付けと呼ばれる新しいタイプの関連付けを提供します。独立キーと外部キーの関連付けの最も明白な違いは、順序クラスです。

public class Order
{
    public int ID { get; set; }
    public int CustomerId { get; set; }  // <-- Customer ID
    public Customer Customer { get; set; } // <-- Customer object
    ...
}

ご覧のように、FKプロパティとエンティティリファレンスの両方があります。2つのタイプの関連付けの間には、さらに多くの違いがあります。

独立した関連付け

  • で独立したオブジェクトとして表現されます。 ObjectStateManager . これは独自の EntityState !
  • アソシエーションを構築する場合、常にアソシエーションの両端からのエンタイトルメントが必要です。
  • このアソシエーションは、エンティティと同じ方法でマッピングされます。

外部キーの関連付け

  • の中で別のオブジェクトとして表現されることはありません。 ObjectStateManager . そのため、いくつかの特別なルールに従わなければなりません。
  • 関連付けを行う場合、関連付けの両端は必要ではありません。子エンティティと親エンティティのPKがあれば十分ですが、PKの値は一意でなければなりません。したがって、外部キーの関連付けを使用する場合は、リレーションで使用される新しく生成されたエンティティに一時的な一意のIDを割り当てる必要があります。
  • この関連付けはマッピングされませんが、その代わりに参照制約を定義します。

外部キーの関連付けを使用する場合、以下の項目をチェックする必要があります。 モデル内に外部キーカラムを含む をチェックする必要があります。

編集してください。

この2種類の関連付けの違いはあまり知られていないことが分かりましたので 短い記事を書きました。 を書きました。