实体框架 - 何时/为什么需要建模“链接”表?

时间:2017-02-06 20:18:05

标签: asp.net-mvc entity-framework

我会先说我是一个数据库人,进入.NET,MVC,EF等。所以我完全理解连接和外键等等,但我正在与EF方面挣扎。

我完成了一个教程,我们做了以下工作:

  • 创建学生表(学生ID和个人详细信息),课程表(课程ID和主题详细信息),以及注册表(注册ID,学生和课程ID以及该课程为该学生提供的成绩)。
  • 为学生和注册实体创建模型,控制器和视图,以允许编辑学生的姓名,为学生注册课程并为他们提供成绩,列出所有注册等。

在该教程中,Enrollments表(我所知道的)是一个“桥梁”表,因为学生与班级是多对多的关系。

如果像这样的多对多场景,我只需要这个“中间”模型/视图/控制器吗?

我想编程的实际结构是:

  • 文章(文章ID,标题,作者,摘要,内容......)是
  • 的成员
  • 类别(CategoryID,title,description,...)

然后我想要一个类别的下拉列表(或任何UI元素),点击所选类别的类别将给出一个页面,其中包含该类别中文章的标题/作者/摘要表。 / p>

如果一篇文章可以属于多个类别(“有效使用猫薄荷”可能同时属于“与猫玩游戏”和“生活黑客”),那么我需要一个“桥牌”表吗?

请允许有人用简单的术语解释 - 我是否只是被该教程中数据的“多对多”性质所拖延,或者“桥”表结构对于导航PK的EF更为基础/ FK关系。

1 个答案:

答案 0 :(得分:3)

我认为您正在阅读的教程试图向您介绍EF的基本概念。如果你有多对多的关系,那么在数据库方面你将总是有三个表:

Student
Course
Enrollment (Student_Id, Course_Id)

在EF世界中,您可以将这三个表表示为三个不同的实体。但是,如果你想拥有一个更自然的"表示学生和课程之间关系的方式,EF允许您将多对多声明为两个列表:

public class Student {
  ... properties
  virtual List<Course> Courses;
}

public class Course {
 ... properties
 virtual List<Student> Students;
}

但是,您需要指示EF如何对待这两方面的引用。为此,您可以使用 fluent API 。使用这个流畅的API,您可以定义引用两个表/实体的表名称:

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

}

Check this article使用流畅的库API解释M:N关系。非常简单,并且你不需要在中间添加这个额外的元素。

在用户界面方面,您只需选择学生想要选择的课程列表,或者选择课程必须具备的学生列表。取决于您如何向用户呈现信息,因为两种功能(学生参加课程和定义学生的课程)都指向相同的m:n关系。

我认为一种简单的方法是向学生展示</select>列表,然后显示他可以申请的课程列表。

您要创建的项目使用相同的想法。基本上,使用EF,你总是需要用&#34;表&#34;来思考。确实,EF允许您将表抽象为实体,但您仍然需要遵循一些规则。总结一下:你是对的。 &#34;桥梁&#34; table是您存储多对多关系的地方。