实体为多对多关系创建一个额外的 table

The Entity create an additional table for many to-many relationships

今天我遇到了一个问题,关于如何使用 Entity Framework Code First fluent api 创建多对多映射。 问题是该实体创建了一个额外的 table 超出了为我设置的范围。

 public class Person
{
    public Person()
    {
        courses = new HashSet<Course>();
    }
    public int PersonID { get; set; }
    public String Name { get; set; }
    public ICollection<Course> courses { get; set; }
}

public class Course
{
    public Course()
    {
        people = new HashSet<Person>();
    }
    public int CourseID { get; set; }
    public String Name { get; set; }
    public ICollection<Person> people { get; set; }
}

public class PersonCourse
{       
    public int fk_CourseID { get; set; }
    public virtual Course course { get; set; }

    public int fk_PersonID { get; set; }
    public virtual Person person { get; set; }

    public String AnotherInformation { get; set; }
}

public class PersonDataConfiguration : EntityTypeConfiguration<Person>
{
    public PersonDataConfiguration()
    {
        ToTable("Person");
        Property(c => c.Name).IsRequired();
        this.HasMany(c => c.courses).WithMany(t => t.people).Map(m => { m.MapLeftKey("CourseID"); m.MapRightKey("PersonID"); });
    }
}

public class CourseDataConfiguration : EntityTypeConfiguration<Course>
{
    public CourseDataConfiguration()
    {
        ToTable("Course");
        Property(c => c.Name).IsRequired();
        this.HasMany(c => c.people).WithMany(t => t.courses).Map(m => { m.MapLeftKey("PersonID"); m.MapRightKey("CourseID"); });
    }
}

public class PersonCourseDataConfiguration : EntityTypeConfiguration<PersonCourse>
{
    public PersonCourseDataConfiguration()
    {
        ToTable("PersonCourseX");
        HasKey(c => new { c.fk_CourseID, c.fk_PersonID });
        Property(c => c.AnotherInformation).IsRequired();
        this.HasRequired(c => c.person).WithMany().HasForeignKey(t => t.fk_PersonID);
        this.HasRequired(c => c.course).WithMany().HasForeignKey(t => t.fk_CourseID);
    }
}

public class ProgramTesteContext : DbContext
{
    public ProgramTesteContext()
        : base("MyConnectionString")
    {

    }

    public DbSet<Person> Person { get; set; }

    public DbSet<Course> Course { get; set; }

    public DbSet<PersonCourse> PersonCourse { get; set; }        

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {            
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();            
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
        modelBuilder.Properties<String>()
            .Configure(p => p.HasColumnType("varchar"));            
        modelBuilder.Properties<String>()
            .Configure(p => p.HasMaxLength(100));

        modelBuilder.Configurations.Add(new PersonDataConfiguration());
        modelBuilder.Configurations.Add(new CourseDataConfiguration());
        modelBuilder.Configurations.Add(new PersonCourseDataConfiguration());
    }        
}

该实体设置了两个 table 用于映射: PersonCourseX 由我和另一个 CoursePerson table 创建,仅包含外键而没有另一个信息字段。 如何让这个秒table不被创建?

更改PersonCourseDataConfiguration如下:

public class PersonCourseDataConfiguration : EntityTypeConfiguration<PersonCourse>
{
    public PersonCourseDataConfiguration()
    {
        ToTable("PersonCourseX");
        HasKey(c => new { c.fk_CourseID, c.fk_PersonID });
        Property(c => c.AnotherInformation).IsRequired();
        this.HasRequired(c => c.person).WithMany(c => c.courses).HasForeignKey(t => t.fk_PersonID);
        this.HasRequired(c => c.course).WithMany(c => c.people).HasForeignKey(t => t.fk_CourseID);
    }
}

删除注释行:

public class PersonDataConfiguration : EntityTypeConfiguration<Person>
{
    public PersonDataConfiguration()
    {
        ToTable("Person");
        Property(c => c.Name).IsRequired();
        //this.HasMany(c => c.courses).WithMany(t => t.people).Map(m => { m.MapLeftKey("CourseID"); m.MapRightKey("PersonID"); });
    }
}

public class CourseDataConfiguration : EntityTypeConfiguration<Course>
{
    public CourseDataConfiguration()
    {
        ToTable("Course");
        Property(c => c.Name).IsRequired();
        //this.HasMany(c => c.people).WithMany(t => t.courses).Map(m => { m.MapLeftKey("PersonID"); m.MapRightKey("CourseID"); });
    }
}

更改PersonCourse如下:

public class Person
{
    //.. other properties
    public ICollection<PersonCourse> courses { get; set; }
}

public class Course
{
   //.. other properties
    public ICollection<PersonCourse> people { get; set; }
}