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)
但是得到了相同的不相关的人您是否检查了数据库中是否有与要加载的
人员相关的
关系
行?是的,我检查了。查询返回了正确的数据计数,但返回了错误的数据。您能否显示您的实体和您正在调用的查询?