2016-12-05 88 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如何知道哪些属性映射到数据库。现在我知道你必须明确排除它们 –