gpt4 book ai didi

.net - Entity Framework CTP5 代码优先 : Mapping a class with multiple collections of another class

转载 作者:行者123 更新时间:2023-12-04 19:19:58 24 4
gpt4 key购买 nike

使用 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

最后三列都与主键有外键关系 CompanyIdCompanies table 。

现在我有几个问题:
  • 1) 为什么我得到 People 中的外键列 table ?我其实期待两个。如果我删除属性 public Company Company { get; set; }来自 Person第三栏 CompanyCompanyId2消失了,但我也失去了类中的引用属性。
  • 2) 假设我放弃了 Company属性(property)来自 Person表(我的模型中不需要它)。有没有办法给剩下的两个外键列另一个名字而不是自动创建的 CompanyCompanyIdCompanyCompanyId1 ? (例如 FCompanyIdMCompanyId 表示与 FemaleEmployeesMaleEmployees 集合的关系。)
  • 3) 有没有什么办法可以只用一个外键来定义这个模型 CompanyIdPeople table ?当然,我需要在 Person 中添加一个区分附加列类(如 bool IsFemale )。人是 FemaleEmployees 的一部分或 MaleEmployees集合,从来没有(在这个例子中很自然),所以使用 SQL 我可以通过类似 WHERE IsFemale = true/false AND CompanyId = 1 的方式获取这些集合。 .我想知道是否可以给 EntityFramework 提示以这种方式加载两个集合。 (这里我想避免通过 FemalePersonMalePerson 类来扩展模型,这两个类都派生自 Person 作为基类,然后使用例如 Table-Per-Hierarchy 映射,因为这些派生类将为空和人工的,除了启用到 SQL Server 的映射外没有其他用途。)只有一个外键 CompanyId会让我成功 non-nullable这对于两个外键是不可能的(在同一行中两者都不能为非空)。

  • 提前感谢您的反馈和建议!

    最佳答案

  • 问题 (1):EF 无法映射单个引用属性 Company在类 Person到两个不同的收集端点 FemaleEmployeesMaleEmployees在类 Company同时。映射约定假定在 Company 中实际上有第三个端点。这在模型中没有暴露。因此创建了第三个外键。
  • 问题(2):随着EF 4.1 Release Candidate现在可以使用 Map 在 Fluent API 中指定外键的数据库列名称(EF CTP5 无法实现)。 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):我仍然不知道。

  • 编辑

    现在就结束这个老问题:(3)(将一个实体中的两个导航属性与另一个实体的同一端点相关联)是不可能的,例如: Specific Entity Framework Code First Many to 2 Model Mapping ...(我记得许多其他问题正在为这种情况寻找解决方案但没有成功)

    关于.net - Entity Framework CTP5 代码优先 : Mapping a class with multiple collections of another class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5067688/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com