暂时忘记数据库和表格。假设我有一个班级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
方法。
但是,为了教育的利益,
答案 0 :(得分:1)
您可以添加与Person表的零或一对一关系的Engineer和Captain表,这将为您提供Spaceship的两个导航属性。如果模型更改并且子类型最终需要新属性或方法,则此方法可能很有用。