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; }
}

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

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

 ---------------------                   ---------------------
|      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. 最好的方法是什么?
4

1 回答 1

1

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

于 2013-02-15T03:44:24.647 回答