C# EF在Id匹配上填充导航属性

C# EF在Id匹配上填充导航属性,c#,entity-framework,C#,Entity Framework,当来自不同类的Profile.MatchId==Dock.MatchId时,我试图填充一个列表 这是两个类的精简版本: public class Profile { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ProfileId { get; set; } public int MatchId { get; set; } public virtual List<Dock&

当来自不同类的
Profile.MatchId==Dock.MatchId
时,我试图填充一个
列表

这是两个类的精简版本:

public class Profile
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ProfileId { get; set; }
  public int MatchId { get; set; }

  public virtual List<Dock> Docks { get; set; } = new List<Dock>();
}

public class Dock
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int DockId { get; set; }
  public int MatchId { get; set; }
}
公共类配置文件
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ProfileId{get;set;}
公共int MatchId{get;set;}
公共虚拟列表停靠{get;set;}=new List();
}
公共船坞
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int DockId{get;set;}
公共int MatchId{get;set;}
}

如何正确填充
列表停靠
导航属性?我相信我需要通过
modelBuilder
将此连接起来-但是以前没有这样做过。

好时机!有一个非常简单的模型关系配置示例

public class SomeContext : DbContext
{
    public DbSet<Profile> Profiles { get; set; }
    public DbSet<Dock> Docks { get; set; }

    protected override Void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.Entity<Dock>()
            .HasOne(x => x.Profile)
            .WithMany(x => x.Docks)
            .HasForeignKey(x => x.ProfileId);
    }
}




public class Profile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProfileId { get; set; }
    public int MatchId { get; set; }

    public virtual List<Dock> Docks { get; set; } = new List<Dock>();
}

public class Dock
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DockId { get; set; }
    public int MatchId { get; set; }

    public int ProfileId { get; set; }
    public Profile Profile { get; set; }
}
公共类SomeContext:DbContext
{
公共数据库集配置文件{get;set;}
公共数据库集停靠{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity()
.HasOne(x=>x.Profile)
.有许多(x=>x.dock)
.HasForeignKey(x=>x.ProfileId);
}
}
公共班级简介
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ProfileId{get;set;}
公共int MatchId{get;set;}
公共虚拟列表停靠{get;set;}=new List();
}
公共船坞
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int DockId{get;set;}
公共int MatchId{get;set;}
公共int ProfileId{get;set;}
公共配置文件{get;set;}
}

实际上,您无法在概要文件中获取列表停靠点的值,因为概要文件和停靠点之间没有直接连接

你可以试试这个

public class Profile
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ProfileId { get; set; }

  public virtual List<Dock> Docks { get; set; } = new List<Dock>();
}

public class Dock
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int DockId { get; set; }

  [ForeignKey("Profile")]
  public int ProfileId { get; set; }
  public Profile Profile {get; set; }
} 
公共类配置文件
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ProfileId{get;set;}
公共虚拟列表停靠{get;set;}=new List();
}
公共船坞
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int DockId{get;set;}
[外键(“配置文件”)]
公共int ProfileId{get;set;}
公共配置文件{get;set;}
} 

我很困惑-
Dock
没有
配置文件
?因为MatchId在这两个表中都不是PK,所以您需要的关联没有FK关系,因此EF不支持。您必须在内存中执行“连接”,或者将MatchId设置为始终等于PK值,然后在此列上执行连接。@DevilSuichiro ahhh-这令人失望。。。。我想我要用一个链接表来代替这个。谢谢你的洞察力。这里几乎所有的东西都是假的。Profile和Docks之间存在直接连接,即Profile.Docks。这也将填充此导航属性(如果包含),但在FK=PK(与您的解决方案相同,但杂乱程度较低)上,OP请求FK=FK。我尝试了,但没有成功。。你能给出一些确切的答案吗