我会先说我是一个数据库人,进入.NET,MVC,EF等。所以我完全理解连接和外键等等,但我正在与EF方面挣扎。
我完成了一个教程,我们做了以下工作:
在该教程中,Enrollments表(我所知道的)是一个“桥梁”表,因为学生与班级是多对多的关系。
如果像这样的多对多场景,我只需要这个“中间”模型/视图/控制器吗?
我想编程的实际结构是:
然后我想要一个类别的下拉列表(或任何UI元素),点击所选类别的类别将给出一个页面,其中包含该类别中文章的标题/作者/摘要表。 / p>
如果一篇文章可以属于多个类别(“有效使用猫薄荷”可能同时属于“与猫玩游戏”和“生活黑客”),那么我需要一个“桥牌”表吗?
请允许有人用简单的术语解释 - 我是否只是被该教程中数据的“多对多”性质所拖延,或者“桥”表结构对于导航PK的EF更为基础/ FK关系。
答案 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是您存储多对多关系的地方。