首页 > 解决方案 > 多对多:无法确定导航属性所代表的关系

问题描述

我正在尝试使用代码优先工作流添加迁移,但似乎 EF 核心无法识别“TeamMember”和“Step”类之间的多对多关系。

我的“步”课:

public class Step {
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public Project Project { get; set; }

    [Required]
    [StringLength(30, MinimumLength = 3, ErrorMessage = "The step name must have between 3 and 30 characters!")]
    public string Name { get; set; }

    [Required]
    [StringLength(500, MinimumLength = 10, ErrorMessage = "The step description must have between 10 and 500 characters!")]
    public string Description { get; set; }

    public ICollection<TeamMember> TeamMembers{ get; set; }        

    public Step() {
    }
}

我的“团队成员”课程:

public class TeamMember {
    public int Id { get; set; }
    public int UserId{ get; set; }
    public User User{ get; set; }
    public string Role { get; set; }
    public int TeamId { get; set; }
    public Team Team{ get; set; }

    public ICollection<Step> Steps{ get; set; }

    public TeamMember() {            
    }
}   

我的上下文类:

public class ProjectContext : IdentityDbContext<User> {
    public ProjectContext(DbContextOptions<ProjectContext> options)
       : base(options) {
    }

    public DbSet<User> User { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<Team> Teams { get; set; }
    public DbSet<Step> Steps { get; set; }        
    public DbSet<TeamMember> TeamMembers{ get; set; }
    protected override void OnModelCreating(ModelBuilder builder) {
        builder.Entity<User>().HasKey(m => m.Id);
        builder.Entity<Project>().HasKey(m => m.Id);
        builder.Entity<Team>().HasKey(m => m.Id);
        builder.Entity<Step>().HasKey(m => m.Id);
        builder.Entity<TeamMember>().HasKey(m => m.Id);
        base.OnModelCreating(builder);
    }
}

错误字符串:无法确定“ICollection”类型的导航属性“Step.TeamMembers”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

如您所见,我ICollection在每个课程中都有一个,但我无法找出错误。

标签: c#entity-framework-core

解决方案


默认情况下,EF Core 不支持多对多关系。

您必须创建一个连接表才能实现关系:

您可以像这样轻松配置它:

步:

public class Step {
    public ICollection<TeamMemberStep> TeamMemberStep { get; set; }        
}

队员:

public class TeamMember {
    public ICollection<TeamMemberStep> TeamMemberStep { get; set; }
}

连接表:

public class TeamMemberStep
{
    public string TeamMemberId { get; set; }
    public virtual TeamMember TeamMember { get; set; }
    public int StepId { get; set; }
    public virtual Step Step { get; set; }
}

数据库上下文:

modelBuilder.Entity<TeamMemberStep>()
    .HasKey(aup => new { aup.TeamMemberId, aup.StepId });

public DbSet<TeamMemberStep> TeamMemberSteps { get; set; }

现在您查询该TeamMemberStep表以从任一方获取您的数据。


推荐阅读