一个人既可以是客户,也可以是客户。
然后Client
和Customer
不能从Person
继承。你必须用组合来对它进行建模。 不是:A Person
是Client
或Customer
。 而不是:A Person
具有属性为Client
和/或Customer
。
随着EF这将是两个一比一的关系:
public class Person
{
public int PersonId { get; set; }
public Client Client { get; set; }
public Customer Customer { get; set; }
}
Client
和Customer
可以有Person
参考闯民宅回Person
。 (他们并不需要有这样的参考,但它是有道理的,以使通过该导航属性访问名字和姓氏。)
public class Client/Customer
{
public int PersonId { get; set; }
public Person Person { get; set; }
}
我认为一个人并不需要始终都一个Client
和一个Customer
属性,但有时只有一个(或甚至零?)。在这种情况下Person
是在这两个关系的本金和Client
/Customer
的家属:他们必须有的Person
参考,但Person
只有可选引用Client
和Customer
。用流利的API,这将被模拟像这样:
modelBuilder.Entity<Person>()
.HasOptional(p => p.Client)
.WithRequired(c => c.Person);
modelBuilder.Entity<Person>()
.HasOptional(p => p.Customer)
.WithRequired(c => c.Person);
Person
和Note
之间的关系是两个普通的一个一对多的关系。 Person
可以有两个导航集...
public ICollection<Note> NotesAsNotator { get; set; }
public ICollection<Note> NotesAsNotatee { get; set; }
...和Note
可以有两个引用Person
与两个外键的属性在一起(他们不需要在模型中,但往往有助于暴露):
public int NotatorIDFK { get; set; }
public Person Notator { get; set; }
public int NotateeIDFK { get; set; }
public Person Notatee { get; set; }
而且关系与流利的API定义如下:
modelBuilder.Entity<Person>()
.HasMany(p => p.NotesAsNotator)
.WithRequired(n => n.Notator)
.HasForeignKey(n => n.NotatorIDFK)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Person>()
.HasMany(p => p.NotesAsNotatee)
.WithRequired(n => n.Notatee)
.HasForeignKey(n => n.NotateeIDFK)
.WillCascadeOnDelete(false);
级联删除亩(至少为两种关系中的一种),否则Person
可以通过多个级联删除路径删除Notes
,这是由于两种关系至少在SQL Server中是被禁止的。
Location
和Client
之间和Location
和Customer
之间的关系又是每一个(总共四个),在Location
4个系列,并Client
和Customer
到Location
两个引用两个一到多的关系。它们与上述关系类似。
Client
和Email
和Customer
和Email
之间的关系是一个问题,因为他们是一对之一,但显然与外键PersonIDFK
(具有唯一键约束?)这不是由EF支持。正如Gert Arnold在评论中所问:为什么Person
和Email
之间没有关系?这两种关系是否表示一个人可以拥有另一个电子邮件地址作为客户而不是客户?我不明白模型的这一部分。
一个人既可以是客户,也可以是客户。一个人可以是一个notator(书写笔记的人)或者notatee(笔记所写的人)。 Notes可以由客户写成关于客户的信息,反之亦然。 –
为什么人和电子邮件之间只有一个关联? –