2016-12-05 92 views
1

我有一個簡單的用戶類實體框架中加入3-外鍵1個關係

public class User 
{ 
    public int ID { get; set; } 
    [Required] 
    public virtual ApplicationUser LoginID { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public string JobTitle { get; set; } 

    [DefaultValue(UserRole.Standard)] 
    public UserRole Role { get; set; } 

    public virtual Company Company { get; set; } 

    public string Email { get { return LoginID.Email; } } 

    public bool HasAccess(UserRole TargetRole) 
    { 
    //Non-relevant logic 
    } 
} 

我也有一個公司類定義爲

public class Company 
    { 
     public int ID { get; set; } 

     [Required] 
     [MaxLength(length: 70)] 
     public string Name { get; set; } 

     public virtual ICollection<User> Employees { get; set; } 
     public virtual ICollection<CompanyEmailDomain> Domains { get; set; } 
     public ICollection<User> Managers { get { return Employees.Where(x => x.Role == UserRole.Manager).ToList(); } } 
    } 

然而,當我運行add-migration命令,它會嘗試將用戶表上的3個外鍵添加到公司表中。誰能告訴我爲什麼會這樣?

AddColumn("dbo.Users", "Company_ID", c => c.Int()); 
AddColumn("dbo.Users", "Company_ID1", c => c.Int()); 
AddColumn("dbo.Users", "Company_ID2", c => c.Int()); 
+0

哪個EF版本是這個? –

+0

@GertArnold我正在使用EF6。這是我第一個使用EF的項目,所以很可能有一個根本的誤解! –

回答

2

實體框架只計算UserCompany之間的關聯。它檢測其中三個:

  1. Company in User
  2. EmployeesCompany
  3. ManagersCompany

他們都1-nCompany - User),因此,EF的結論,User需要三個外鍵。

知道Managers是一個計算屬性。事實上,該屬性甚至不應該被映射。您應該爲其添加[NotMapped]屬性或將其映射爲流暢映射API忽略。

另外,知道User.CompanyCompany.Employees是一個關聯的兩端。但是由於這兩個屬性,EF不知道爲User.Company的另一端(反轉端)選擇哪一個。

現在,如果您取消映射Company.Managers,EF將會看到兩個屬性 - User.CompanyCompany.Employees - 並假設它們屬於一起。因此,通過取消映射一個屬性,只會創建一個外鍵。

+0

輝煌,歡呼。我想知道EF如何知道哪些屬性映射到數據庫。現在我知道你必須明確排除它們 –