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)
最后三列CompanyId
与Companies
表的主键具有所有外键关系.
现在我有几个问题:
1)为什么我在表中得到三个外键列People
?我其实期待两个.如果我public Company Company { get; set; }
从Person
第三列删除属性CompanyCompanyId2
消失但我也丢失了类中的引用属性.
2)假设我Company
从Person
表中删除了属性(我的模型中并不需要它).有没有办法让剩下的两个外键列另一个名字比自动创建CompanyCompanyId
和CompanyCompanyId1
?(例如,FCompanyId
并MCompanyId
指出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
使用两个外键(两个外键在同一行中永远不能为空).
感谢您提前提供反馈和建议!
Company
对于问题(1):EF 无法将类中的单个引用属性映射Person
到两个不同的集合端点FemaleEmployees
并同时映射MaleEmployees
到类中。Company
映射约定假设实际上存在第三个端点,Company
该端点未在模型中公开。因此创建了第三个外键。
对于问题 (2):在EF 4.1 候选版本中,现在可以使用类的方法在 Fluent API 中指定外键的数据库列名称(这在 EF CTP5 中是不可能的Map
)ForeignKeyNavigationPropertyConfiguration
:
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模型映射...(并且我记得许多其他问题正在寻找这种情况的解决方案但没有成功)
归档时间: |
|
查看次数: |
1415 次 |
最近记录: |