实体为许多对多关系创建了一个附加表

时间:2016-02-22 18:02:21

标签: entity-framework many-to-many relationship ef-fluent-api

今天我有一个关于如何使用Entity Framework Code First流畅的api创建多对多映射的问题。 问题是该实体创建了一个超出为我设置的附加表。

 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());
    }        
}

实体设置了两个用于映射的表: 由我创建的PersonCourseX和另一个只包含没有其他信息字段的外键的CoursePerson表。 如何创建第二个表?

1 个答案:

答案 0 :(得分:0)

按如下方式更改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; }
}