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

2024-03-21

使用 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”表示“外键关系名称”,由 SQL Server 中的 EF 创建):

PersonId            int     not nullable
CompanyCompanyId    int     nullable       FKRN: Company_FemaleEmployees
CompanyCompanyId1   int     nullable       FKRN: Company_MaleEmployees
CompanyCompanyId2   int     nullable       FKRN: Person_Company

最后三列与主键都有外键关系CompanyId of the Companies table.

现在我有几个问题:

  • 1)为什么我会得到three中的外键列People桌子?我实际上期望有两个。如果我移除该财产public Company Company { get; set; }来自Person第三列CompanyCompanyId2消失了,但我也失去了类中的引用属性。

  • 2)假设我放弃了Company财产来自Person表(我的模型中实际上不需要它)。有没有办法为剩下的两个外键列指定一个名称而不是自动创建的名称CompanyCompanyId and CompanyCompanyId1? (例如FCompanyId and MCompanyId来表明与FemaleEmployees and MaleEmployees收藏。)

  • 3)有没有办法只用一个外键来定义这个模型CompanyId in the People桌子?当然,我需要在Person类(如bool IsFemale)。一个人要么是FemaleEmployees or the MaleEmployees集合,从不在两者中(当然在本例中),因此使用 SQL 我可以通过类似的方式获取这些集合WHERE IsFemale = true/false AND CompanyId = 1。我想知道是否可以给 EntityFramework 一个提示,以这种方式加载两个集合。 (在这里我想避免将模型扩展为FemalePerson and MalePerson两者都派生于的类Person作为基类,然后使用例如 Table-Per-Hierarchy 映射,因为这些派生类将是空的和人造的,除了启用到 SQL Server 的映射之外没有其他目的。)只有一个外键CompanyId会让我成功non-nullable这对于两个外键是不可能的(同一行中的两个外键永远不能为非空)。

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


  • 对于问题(1):EF无法映射单个引用属性Company在班上Person到两个不同的收集端点FemaleEmployees and MaleEmployees在班上Company同时。映射约定假设实际上存在第三个端点Company这在模型中没有暴露。因此创建了第三个外键。

  • 对于问题(2):EF 4.1 候选版本 http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx现在可以通过使用以下命令在 Fluent API 中指定外键的数据库列名称(这在 EF CTP5 中是不可能的)Map的方法ForeignKeyNavigationPropertyConfiguration class:

    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);
    
  • 对于问题(3):我还是不知道。

Edit

现在就结束这个老问题:(3)(将一个实体中的两个导航属性与另一个实体的同一端点相关)是不可能的,例如:特定实体框架代码优先多对2模型映射 https://stackoverflow.com/questions/5342848/specific-entity-framework-code-first-many-to-2-model-mapping/5343570#5343570...(我记得许多其他问题正在为这种情况寻找解决方案,但没有成功)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 CTP5 代码优先:将一个类与另一个类的多个集合映射 的相关文章

随机推荐