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。我尝试了,但没有成功。。你能给出一些确切的答案吗