一個人既可以是客戶,也可以是客戶。
然後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可以由客戶寫成關於客戶的信息,反之亦然。 –
爲什麼人和電子郵件之間只有一個關聯? –