使用 EF CTP5 Code-First,我试图映射一个类模型,该模型包含一个类中的多个集合,指向另一个类。这是我的意思的一个例子:
public class Company
{
public int CompanyId { get; set; }
public IList<Person> FemaleEmployees { get; set; }
public IList<Person> MaleEmployees { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public Company Company { get; set; }
}
如果我让数据库从此模型创建DbContext
而无需进一步定制,如下所示:
public class MyContext : DbContext
{
public DbSet<Company> Companies { get; set; }
public DbSet<Person> People { get; set; }
}
...然后我在 SQL Server 中得到两个表,一个Companies
只有一CompanyId
列的简单表和一个People
包含以下列的表(“FKRN”表示“外键关系名称”,由 EF 在 SQL Server 中创建):
PersonId int not nullable
CompanyCompanyId int nullable FKRN: Company_FemaleEmployees
CompanyCompanyId1 int nullable FKRN: Company_MaleEmployees
CompanyCompanyId2 int nullable FKRN: Person_Company
CompanyId
最后三列与表的主键都有外键关系Companies
。
现在我有几个问题:
1)为什么我在表中得到三个外键列
People
?我实际上期望两个。如果我public Company Company { get; set; }
从Person
第三列中删除属性CompanyCompanyId2
会消失,但我也会丢失类中的引用属性。2)假设我
Company
从表中删除了属性Person
(我的模型中并不需要它)。有没有办法给剩下的两个外键列另一个名称而不是自动创建的CompanyCompanyId
andCompanyCompanyId1
?(例如FCompanyId
andMCompanyId
表示与FemaleEmployees
和MaleEmployees
集合的关系。)3) 有没有办法用表
CompanyId
中的一个外键来定义这个模型People
?当然,我需要在Person
类中添加一个与众不同的列(如bool IsFemale
)。Person 要么是集合的一部分,要么FemaleEmployees
是MaleEmployees
集合的一部分,从不在两者中(在这个例子中很自然),所以使用 SQL 我可以通过类似WHERE IsFemale = true/false AND CompanyId = 1
. 我想知道是否可以给 EntityFramework 提示以这种方式加载两个集合。(在这里我想避免通过一个FemalePerson
和MalePerson
类来扩展模型,这两个类都派生自Person
作为基类,然后使用例如 Table-Per-Hierarchy 映射,因为这些派生类将是空的和人为的,除了启用到 SQL Server 的映射之外没有其他目的。)只有一个外键可以让CompanyId
我做到non-nullable
使用两个外键是不可能的(在同一行中两者都不能是非空的)。
提前感谢您的反馈和建议!