2017-07-02 101 views
1

我对EF asp.net mvc中的代码第一逻辑有些困惑。在asp.net页面上的例子说,对于本数据库结构 Example Database for Student and Course with intermediate table enrollmentMVC asp.net中的关系逻辑代码优先的一对多EF

public class Student 
{ 
    public int ID { get; set; } 
    public string LastName { get; set; } 
    public string FirstMidName { get; set; } 
    public DateTime EnrollmentDate { get; set; } 

    public virtual ICollection<Enrollment> Enrollments { get; set; } 
} 


public class Enrollment 
{ 
    public int EnrollmentID { get; set; } 
    public int CourseID { get; set; } 
    public int StudentID { get; set; } 
    public Grade? Grade { get; set; } 

    public virtual Course Course { get; set; } 
    public virtual Student Student { get; set; } 
} 

为什么我需要在模型中为学生入学指定?不是SQL关系在招生中已经定义,即我可以(不包括EF asp.net)通过执行类似

SELECT course.Title FROM enrollment, course WHERE enrollment.student = studentID AND course.courseID = enrollment.CourseID 

在这里得到了一个学生都coureses我不需要任何信息在学生表中注册。为什么在MVC EF设置中需要它?

+0

我会说这个例子有点过了top ... Student.Enrollments成员被声明为虚拟的,因此它被延迟加载并服务于'helper'的目的,以便直接从代码中访问注册表。 – pijemcolu

回答

1

的导航属性的目的是使关系透明在你的学生对象,也让你找到一个学生全部入学率与像一个简单的查询:

// get all enrolments for Sutdent with certain Id 
    var enrolments = context.Students 
     .FirstOrDefault(s => s.ID == studentId)?.Enrollments?.ToList(); 

// get all courses for a student 
    var courses = context.Courses 
     .Include(x => x.Enrollments) 
     .SelectMany(c => c.Enrollments) 
     .Where(e => e.StudentID == studentId) 
     .ToList(); 

“在实体框架,一个实体可以通过关联关系与其他实体相关联,每个关系包含描述实体类型和关系中两个实体类型的多重性(一个,零个或一个或多个)的两端。关系可以受参考约束的控制,该约束描述关系中的哪一端是主要角色,哪一个是依赖角色。

导航属性提供了一种导航两种实体类型之间关联的方法。每个对象都可以拥有其参与的每个关系的导航属性。导航属性允许您在两个方向上导航和管理关系,返回参考对象(如果多重性为1或0或1)或集合(如果多重性很大)。您也可以选择单向导航,在这种情况下,您只在参与关系的一种类型上定义导航属性,而不在两者上定义导航属性。“https://msdn.microsoft.com/en-us/library/jj713564(v=vs.113).aspx

+0

好吧,基本上它可以帮助你定义关系双方,但这是没有必要的。 – rst

+0

@RobertStettler正确! –

相关问题