13.翻譯系列:Code-First方式配置多對多關係【EF 6 Code-First系列】

原文連接:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspxhtml

EF 6 Code-First系列文章目錄:typescript

這裏,咱們將學習如何在Student實體和Course實體間配置多對多關係,Student能夠參加不少Courses,而且多個學生能夠加入同一個Course。數據庫

能夠看下這篇文章, Entity Relationship 瞭解一下EF是如何管理實體間的一對一,一對多以及多對多關係的。api

經過默認約定配置多對多關係

EF 6包含多對多關係的默認約定,你須要在兩個實體間都包含集合類型的導航屬性。例如:Student類應該包含一個集合類型的導航屬性Course,一樣Course類也應該包含一個集合類型的導航屬性Student:app

public class Student
{
    public Student() {
        this.Courses = new HashSet<Course>();
    }

    public int StudentId { get; set; }
    [Required]
    public string StudentName { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}
        
public class Course
{
    public Course() {
        this.Students = new HashSet<Student>();
    }

    public int CourseId { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

下面的上下文類中,包含Student和Course實體:ide

public class SchoolDBContext : DBContext
{
    public SchoolDBContext() : base("SchoolDB-DataAnnotations") {
    }

    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }
        
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);
    }
}

EF API將會建立Students表和Courses表,一樣還會建立聯接表StudentCourses,StudentCourses表中,包含兩個表中的主鍵做爲主鍵以及外鍵:學習

 

enter description here
enter description here

 

注意:聯接表的名稱就是兩個實體名稱+後綴s.測試

使用Fluent API配置多對多關係

上面的例子中,你已經看到了默認的約定爲咱們建立了多對多關係的表,以及相關的聯接表。咱們能夠使用FLuent API來配置鏈接表的名稱和列。ui

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentRefId");
                            cs.MapRightKey("CourseRefId");
                            cs.ToTable("StudentCourse");
                        });

}

上面的代碼中,HasMany()方法和WithMany()方法,用來給Student和Course實體配置多對多關係。Map()方法包含一個Action類型的委託,這裏咱們傳入lambda,來定製聯接表。MapLeftKey()用來指定Student表中的主鍵名稱(由於咱們從Student實體開始配置,因此Student是左表),MapRightKey()用來配置Course表中的主鍵名稱,ToTable用來指定聯接表的名稱。this

 

enter description here
enter description here

 

這樣你就經過Fluent API重寫了默認約定,配置了多對多關係。

相關文章
相關標籤/搜索