Asp.net mvc 实体框架映射。多个外键
我有两张桌子Asp.net mvc 实体框架映射。多个外键,asp.net-mvc,entity-framework,fluent-interface,Asp.net Mvc,Entity Framework,Fluent Interface,我有两张桌子 People Relation ------------- ----------------- Id (int) Id (int) Name (string) ParentPeopleId (int) ChildPeopleId (int) 我需要通过与union all的关系表获取所有人。 关系表有两个外键。映射它们有一个问题。
People Relation
------------- -----------------
Id (int) Id (int)
Name (string) ParentPeopleId (int)
ChildPeopleId (int)
我需要通过与union all的关系表获取所有人。
关系表有两个外键。映射它们有一个问题。映射是一对多的。人有很多关系,关系有一个人
我将它们映射如下:
HasRequired(r=> r.People).WithMany(p=>p.Relation).HasForeignKey(r=>r.ChildPeopleId);
HasRequired(r=> r.ParentPeople ).WithMany(p=>p.ParentRelations ).HasForeignKey(r=>r.ParentPeopleId);
HasRequired(r=> r.ChildPeople).WithMany(p=>p.ChildRelations ).HasForeignKey(r=>r.ChildPeopleId );
那么,如何映射第二个外键呢?对于
关系表中的每个FK列,您应该在关系
实体中有一个导航属性(这不是强制性的,但强制性的是在关系中涉及的实体之间至少有一个导航属性)。在这种情况下,人员
和关系
之间有两种关系,导航属性表示关系的一端。您的模型可以是这样的:
public class Relation
{
public int Id {get;set;}
public int ParentPeopleId {get;set;}
public int ChildPeopleId {get;set;}
public virtual People ParentPeople {get;set;}
public virtual People ChildPeople {get;set;}
}
public class People
{
public int Id {get;set;}
public string Name {get;set;}
public virtual ICollection<Relation> ParentRelations {get;set;}
public virtual ICollection<Relation> ChildRelations {get;set;}
}
var Peoplelist = MyDbContext.People.Include(p=>p.Relations).ToList();
现在,如果您不想使用人员
实体中的某个集合导航属性,可以创建单向关系。例如,如果您不想要ParenRelations
navigation属性,可以按如下方式配置该关系:
HasRequired(r=> r.ParentPeople).WithMany().HasForeignKey(r=>r.ParentPeopleId);
更新
让我先从一个建议开始。我认为您的表关系
没有发挥任何作用,因为您只有这些列。如果一个人只有父母,我会将您的模型更改为以下:
public class People
{
public int Id {get;set;}
public string Name {get;set;}
public int ParentId {get;set;}
public virtual People Parent {get;set;}
public virtual ICollection<People> Children {get;set;}
}
现在回到您的,EF将您的ChildPeopleId
属性视为一个简单的标量列,它不知道它是一个FK列,这是我上面建议的映射两个关系而不是一个关系的方式
另一件事,下面这行
var Peoplelist = MyDbContext.People.Include(p=>p.Relations.Select(r=>r.People)).ToList();
您告诉EF,您希望加载与人员
相关的关系
实体,但也希望加载与每个关系
相关的人员
,这与关系
来自的人员
,因此,您不需要执行最后一次选择,如果您的数据正确相关,则在执行查询时将加载人员导航属性,因此,该查询应如下所示:
public class Relation
{
public int Id {get;set;}
public int ParentPeopleId {get;set;}
public int ChildPeopleId {get;set;}
public virtual People ParentPeople {get;set;}
public virtual People ChildPeople {get;set;}
}
public class People
{
public int Id {get;set;}
public string Name {get;set;}
public virtual ICollection<Relation> ParentRelations {get;set;}
public virtual ICollection<Relation> ChildRelations {get;set;}
}
var Peoplelist = MyDbContext.People.Include(p=>p.Relations).ToList();
我需要按人员表获取所有子文档。尝试以下操作:context.People.Include(p=>p.Relation)
但是得到了相同的不相关的人您是否检查了数据库中是否有与要加载的人员相关的关系
行?是的,我检查了。查询返回了正确的数据计数,但返回了错误的数据。您能否显示您的实体和您正在调用的查询?