一个实体可以包含两个相同类型的不同实体,可以唯一访问吗?

时间:2013-02-14 23:07:24

标签: sql-server asp.net-mvc database entity-framework database-design

暂时忘记数据库和表格。假设我有一个班级Spaceship和一个班级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; }
}

因为船长和工程师都是人,虽然他们的相关信息可能略有不同,但如果他们属于同一类型,他们将保持最干。

但是,如果我想在实体框架中建立这种关系怎么办?如果我在实体设计师中绘制它,我会建立这样的关系:

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

但这不是一回事。因为虽然两个People可以准确地共享同一个类,但它们与Spaceship的关系根本不同。我想要一个dbContext,我可以说

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

要问太多了吗?我的意思是,当然,还有其他方法。 Person Role可以是“队长”或“工程师”,然后你可以将它们全部归入Enterprise.People。如果您需要经常访问队长,您甚至可以在GetCaptain()上设置Spaceship方法。

但是,为了教育的利益,

  1. 可以吗?
  2. 如果是这样,对实际数据库架构会产生什么影响?
  3. 最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以添加与Person表的零或一对一关系的Engineer和Captain表,这将为您提供Spaceship的两个导航属性。如果模型更改并且子类型最终需要新属性或方法,则此方法可能很有用。