0

データベースとテーブルのことはしばらく忘れてください。classSpaceshipとclass があるとしPersonます。Contract私がモデルを書いている場合、私はこれを行うかもしれません:

public class Spaceship {
  public string LicensePlate { get; set; } //
  public string Destination { get; set; }  //Regular old data
  public Person Captain { get; set; }
  public Person Engineer { get; set; }
}

船長と機関士はどちらも人間であり、関連する情報は多少異なる場合がありますが、同じタイプであれば最も DRY なままです。

しかし、Entity Framework でこの種の関係を作成したい場合はどうすればよいでしょうか。エンティティ デザイナーで作成する場合、次のような関係を作成します。

 ---------------------                   ---------------------
|      Spaceship      |                 |        Person       |
|---------------------|                 |---------------------|
|    LicensePlate     |                 |    Name             |
|    Destination      |                 |    PhoneNumber      |
|---------------------|                 |---------------------|
|Navigation Properties|                 |Navigation Properties|
|    People           |1---------------*|    Spaceship        |
 ---------------------                   ---------------------

しかし、これは同じことではありません。この 2 つPeopleは正確には同じクラスを共有できますが、 との関係Spaceshipは根本的に異なります。私が言うことができるdbContextが欲しい

Spaceship Enterprise = new Spaceship();
Enterprise.Captain = People.Find("Kirk");
Enterprise.Engineer = People.Find("Scotty");

それは求めすぎですか?もちろん、他の方法もあります。「Captain」または「Engineer」という があり、それらすべてを にまとめることができPersonます。キャプテンに頻繁にアクセスする必要がある場合は、メソッドを作成することもできます.RoleEnterprise.PeopleGetCaptain()Spaceship

しかし、教育の観点から、

  1. それは可能ですか?
  2. もしそうなら、実際のデータベース スキーマにどのような影響がありますか?
  3. 最善の方法は何ですか?
4

1 に答える 1

1

宇宙船の 2 つのナビゲーション プロパティを提供する Person テーブルとゼロまたは 1 対 1 の関係を持つ Engineer テーブルと Captain テーブルを追加できます。このアプローチは、モデルが変更され、いずれかのサブタイプが新しいプロパティまたはメソッドを必要とする場合に役立ちます。

于 2013-02-15T03:44:24.647 に答える