Entity framework core EF core如何与“自身”建立许多关系

Entity framework core EF core如何与“自身”建立许多关系,entity-framework-core,ef-code-first,asp.net-core-2.0,Entity Framework Core,Ef Code First,Asp.net Core 2.0,案例:团队成员是在医院工作的任何人。团队成员医生可以让其他团队成员担任其助理护士或其他医生,或者团队成员可以是其他团队成员的助理 班级 public class Teammember { Public int Id {get; set;} public ICollection<AssistantLink> AssistantLinks { get; } = new List<AssistantLink>(); public ICollection

案例:团队成员是在医院工作的任何人。团队成员医生可以让其他团队成员担任其助理护士或其他医生,或者团队成员可以是其他团队成员的助理

班级

public class Teammember 
{
    Public int Id {get; set;}
    public ICollection<AssistantLink> AssistantLinks { get; } = new List<AssistantLink>();
    public ICollection<Teammember> Assistants => AssistantLinks.Where(x => x.CareProviderId == Id).Select(x => x.Assistant).ToList();
    public ICollection<Teammember> CareProviders => AssistantLinks.Where(x => x.AssistantId == Id).Select(x => x.CareProvider).ToList();
}
在DB上下文中,我试图通过以下方式建立这种关系:

    builder.Entity<AssistantLink>().HasKey(x => new { x.CareProviderId, x.AssistantId });
    builder.Entity<AssistantLink>().HasOne(x => x.CareProvider).WithMany("AssistantLinks"); //use string notation because navigation property is private
    builder.Entity<AssistantLink>().HasOne(x => x.Assistant).WithMany("AssistantLinks");
在创建db迁移时,我得到以下信息

错误:无法在之间创建关系 “Teammember.AssistantLink”和“AssistantLink.Assistant”,因为 “Teammember.AssistantLink”之间已存在关系 和“AssistantLink.CareProvider”。导航属性只能 参与单一关系


有没有关于如何正确设置的建议?

不可能只有一个具有关系的集合。您需要两个-一个是带有助手链接的团队成员等于CareProvider,另一个是带有助手链接的团队成员等于助手

模型

配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AssistantLink>()
            .HasKey(x => new { x.CareProviderId, x.AssistantId });
        modelBuilder.Entity<AssistantLink>()
            .HasOne(al => al.CareProvider)
            .WithMany(c => c.Providers)
            .HasForeignKey(al => al.CareProviderId)
            .OnDelete(DeleteBehavior.Restrict);
        modelBuilder.Entity<AssistantLink>()
            .HasOne(al => al.Assistant)
            .WithMany(a => a.Assistants)
            .HasForeignKey(al => al.AssistantId)
            .OnDelete(DeleteBehavior.Restrict); 
    }

EF Core不支持多对多,因此您不必在中间实体和关系的每一方之间建立两个一对多关系。在这里,关系的每一方恰好是同一个实体,因此在该实体上需要两个集合,每一方一个。
public class Teammember
{
    public int Id { get; set; }
    public ICollection<AssistantLink> Assistants { get; set; } 
    public ICollection<AssistantLink> Providers { get; set; }
}
public class AssistantLink : ModelBase
{
    public int CareProviderId { get; set; }
    public Teammember CareProvider { get; set; }
    public int AssistantId { get; set; }
    public Teammember Assistant { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AssistantLink>()
            .HasKey(x => new { x.CareProviderId, x.AssistantId });
        modelBuilder.Entity<AssistantLink>()
            .HasOne(al => al.CareProvider)
            .WithMany(c => c.Providers)
            .HasForeignKey(al => al.CareProviderId)
            .OnDelete(DeleteBehavior.Restrict);
        modelBuilder.Entity<AssistantLink>()
            .HasOne(al => al.Assistant)
            .WithMany(a => a.Assistants)
            .HasForeignKey(al => al.AssistantId)
            .OnDelete(DeleteBehavior.Restrict); 
    }