实体框架CTP5代码优先:使用另一个类的多个集合映射一个类

Sla*_*uma 5 .net entity-framework code-first ef-code-first entity-framework-ctp5

使用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; }
}
Run Code Online (Sandbox Code Playgroud)

如果我让数据库从这个模型创建DbContext而没有进一步的自定义,如下所示:

public class MyContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<Person> People { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

...然后我在SQL Server中得到两个表,一个Companies只有一CompanyId列的简单表和一个People包含以下列的表("FKRN"表示"外键关系名称",由SQL在SQL Server中创建):

PersonId            int     not nullable
CompanyCompanyId    int     nullable       FKRN: Company_FemaleEmployees
CompanyCompanyId1   int     nullable       FKRN: Company_MaleEmployees
CompanyCompanyId2   int     nullable       FKRN: Person_Company
Run Code Online (Sandbox Code Playgroud)

最后三列CompanyIdCompanies表的主键具有所有外键关系.

现在我有几个问题:

  • 1)为什么我在表中得到三个外键列People?我其实期待两个.如果我public Company Company { get; set; }Person第三列删除属性CompanyCompanyId2消失但我也丢失了类中的引用属性.

  • 2)假设我CompanyPerson表中删除了属性(我的模型中并不需要它).有没有办法让剩下的两个外键列另一个名字比自动创建CompanyCompanyIdCompanyCompanyId1?(例如,FCompanyIdMCompanyId指出FemaleEmployeesMaleEmployees集合的关系.)

  • 3)有没有办法CompanyIdPeople表中只用一个外键来定义这个模型?当然,我需要一个与众不同的额外专栏Person(如bool IsFemale).Person既可以FemaleEmployeesMaleEmployees集合的一部分,也可以是集合的一部分,从不在两者中(在本例中很自然),因此使用SQL我可以通过类似的方式获取这些集合WHERE IsFemale = true/false AND CompanyId = 1.我想知道我是否可以给EntityFramework提示以这种方式加载这两个集合.(这里我想避免通过一个FemalePersonMalePerson类来扩展模型,它们都是Person作为基类派生的,然后使用例如Table-Per-Hierarchy映射,因为这些派生类是空的和人为的,除了启用之外没有其他目的映射到SQL Server.)只有一个外键CompanyId允许我non-nullable使用两个外键(两个外键在同一行中永远不能为空).

感谢您提前提供反馈和建议!

Sla*_*uma 3

  • Company对于问题(1):EF 无法将类中的单个引用属性映射Person到两个不同的集合端点FemaleEmployees并同时映射MaleEmployees到类中。Company映射约定假设实际上存在第三个端点,Company该端点未在模型中公开。因此创建了第三个外键。

  • 对于问题 (2):在EF 4.1 候选版本中,现在可以使用类的方法在 Fluent API 中指定外键的数据库列名称(这在 EF CTP5 中是不可能的MapForeignKeyNavigationPropertyConfiguration

    modelBuilder.Entity<Company>()
                .HasMany(c => c.FemaleEmployees)
                .WithOptional()
                .Map(conf => conf.MapKey("FCompanyId"))
                .WillCascadeOnDelete(false);
    
    modelBuilder.Entity<Company>()
                .HasMany(c => c.MaleEmployees)
                .WithOptional()
                .Map(conf => conf.MapKey("MCompanyId"))
                .WillCascadeOnDelete(false);
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于问题(3):我还是不知道。

编辑

现在就结束这个老问题:(3)(将一个实体中的两个导航属性与另一个实体的同一端点相关)是不可能的,例如:特定实体框架代码优先多对2模型映射...(并且我记得许多其他问题正在寻找这种情况的解决方案但没有成功)