13

我试图找出如何表示两个实体之间的桥接表(多对多关系)我首先使用实体​​框架代码

Student:
   StudentID int  PK
   StudentName VARCHAR(50)

Class:
   ClassID int PK
   ClassName VARCHAR(50)

StudentClass:
   StudentID INT PK
   ClassID INT PK

我应该使用什么最好的类结构来在实体框架代码中表示它,以及如何从桥表中选择并插入其中。

我应该像这样表示类:

    public class Student
    {
        public int StudentId { get; set; }
        public string StudentName { get; set; }

        public List<Class> Class { get; set; }

    }


    public class Class
    {
        public int ClassId { get; set; }
        public string ClassName { get; set; }

        public List<Student> Students { get; set; }
    }
4

2 回答 2

14

简而言之:Student和之间的这种关系类型在EF术语中Class称为多对多关系。

实体框架以一种很好的方式处理参与多对多关系的表。如果联结表(有时称为桥表、关联表、链接表等)仅由外键组成,没有其他列,则该表由 EF 抽象,并且双方获得一个导航属性,公开对方的集合边。

您需要首先为上述表格生成一个实体模型,或者定义您的代码优先结构,如下面的帖子 -使用代码优先创建多对多映射

基本上,根据您的结构,您需要设置OnModelCreating适合类中关系的方法。

protected override void OnModelCreating(DbModelBuilder modelBuilder)

根据您的查询需求,您会发现查看以下参考资料会有所帮助:

于 2013-01-03T23:50:51.443 回答
4

在 Code First 中有很多方法可以表示多对多关系。这实际上仅取决于您对映射的需求。如果您只需要注册地图,那么到目前为止您所拥有的一切都有效。您显示的关系将被 Code First 识别,并且会自动为您创建一个名为“StudentClasses”的映射表

要在映射表中创建映射,只需执行以下操作:

using(var context = new StudentClassContext())
{ 
     Student aStudent = new Student{ StudentName="Johnny", Class = new Class(){ ClassName="Gym"}}
     context.Students.Add(aStudent);
     context.SaveChanges();
}

您也可以反过来执行此操作:

using(var context = new StudentClassContext())
{ 
     Class aClass = new Class{ ClassName = "Gym", Students = new Student(){ StudentName="Johnny"}}
     context.Classes.Add(aClass);
     context.SaveChanges();
}

如果您想更具体和明确地了解关系,可以在覆盖的上下文 OnModelCreating() 方法中设置显式映射。看起来像这样:

public class StudentClassContext
{
    public DbSet<Student> Students { get; set; }
    public DbSet<Class> Classes { get; set; }

    public StudentClassContext()
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
           .HasMany(aStudent => aStudent.Classes) // A student can have many classes
           .WithMany(aClass => aClass.Students)); // Many classes can have many students
         //.Map(c => c.ToTable("StudentClass); // Set the mapping table to this name
    }

}

如果由于某种原因您需要在代码中或在 EntityFramework 上下文操作之外访问映射表,我会说创建一个专用的映射类并使其成为代码中的一等公民:

public class Student
{
    //...
}


public class Class
{
    //...
}

// New Map Class
public class StudentClassMapRecord
{
    public int Id; // Map record PK
    public Student Student { get; set; }
    public Class Class { get; set; }

    public StudentClassMapRecord(Student aStudent, Class aClass)
    {
        Student = aStudent;
        Class = aClass;
    }

    //Uncomment below if you don't need property navigation
    //public int StudentId { get; set; }
    //public int ClassId { get; set; }        
    //public StudentClassMapRecord(int studentId, int classId)
    //{
    //    StudentId = studentId;
    //    ClassId = classId;
    //} 
}
于 2014-02-16T02:15:20.813 回答