2012-09-23 60 views
1

我有一組四個POCO對象需要引用自己這樣說:設置像第一次在EF代碼引用外鍵

自由職業者可以有多個客戶

客戶可以有多個項目

項目可以有多個故事。

我想要確定的一點是,自由職業者開始時沒有客戶,客戶開始時沒有項目,項目開始時沒有任何故事,所以我猜他們需要是空的?

另一方面的情況恰恰相反,一個故事需要一個項目,項目需要一個客戶,而一個客戶需要一個自由職業者。

我只想看看當我創建模型(onModelCreating覆蓋)時是否有任何需要做的事情來確保這是發生的關係。

這裏是我的對象:

public class Freelancer 
{ 
    public int ID { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string CompanyName { get; set; } 
    public string Avatar { get; set; } 
    public Address FreelancerAddress { get; set; } 
    public ICollection<Client> Clients { get; set; } 
} 


public class Client 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Address ClientAddress { get; set; } 
    public string Logo { get; set; } 
    public ICollection<Project> Projects { get; set; } 
} 


public class Project 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Summary { get; set; } 
    public string Description { get; set; } 
    public ICollection<Story> Stories { get; set; } 
} 


public class Story 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
    public decimal Duration { get; set; } 
    public bool Billable { get; set; } 
    public string Notes { get; set; } 
} 

我明白EF自動做一些事情,我只是問是否有更多我需要做,以確保我有我想要的關係。由於

回答

1

按照慣例模型將創建可選關係(「客戶可以有一個自由職業者,但並不需要」),但既然你想需要的關係(「客戶需要一個自由職業者」),則必須用流利的API定義它:

modelBuilder.Entity<Freelancer>() 
    .HasMany(f => f.Clients) 
    .WithRequired() 
    .Map(m => m.MapKey("FreelancerID")); // FK column name in Clients table 

您可以在不最後一行(Map)工作。然後EF會創建一個默認的外鍵名稱,下劃線,可能是Freelancer_ID

和其他關係相同的映射。

或者你可以用外鍵的屬性引入逆導航性能:如因外鍵屬性FreelancerID不能爲空自動必需的,你不需要

public class Client 
{ 
    public int ID { get; set; } 
    //... 
    public ICollection<Project> Projects { get; set; } 

    public int FreelancerID { get; set; } 
    public Freelancer Freelancer { get; set; } 
} 

有了這樣一個模型EF將識別的關係與Fluent API的其他映射。

+0

喜歡最後一部分,只是一個澄清。如果我有一個客戶有一個自由職業者,然後有一個名爲FreelancerId的財產,EF會認識到,作爲FK沒有任何明確的設置? – ledgeJumper

+1

@davidisawesome:是的,因爲約定:*如果有一個名爲XYZ('Freelancer')的導航引用將關鍵屬性DEF('ID')作爲目標類ABC(在這種情況下也是'Freelancer')和一個與目標類('int')中的鍵屬性具有相同類型的標量屬性,以及由導航屬性的名稱和目標類的關鍵屬性('Freelancer' +'ID' ='FreelancerID')組成的名稱,然後這個標量屬性被認爲代表外鍵。*(whew!)如果你想將名字改爲例如'FreelanceCode',你需要註釋或者Fluent API。 – Slauma

+0

很好的解釋。非常感謝你 – ledgeJumper