MVC asp.net中的关系逻辑为1-many代码优先EF

时间:2017-07-02 10:09:19

标签: c# asp.net-mvc entity-framework

我对EF asp.net mvc中的代码第一个逻辑感到有些困惑。 asp.net页面上的示例说明了这个数据库结构 Example Database for Student and Course with intermediate table enrollment

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)通过做类似的事情获得一个学生的所有coureses

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

在这里,我不需要有关学生表中注册的任何信息。为什么我需要在MVC EF设置中使用它?

1 个答案:

答案 0 :(得分:1)

导航属性的目的是使您的Student对象中的关系透明,并让您通过简单查询找到学生的所有注册:

// 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();

“在实体框架中,一个实体可以通过关联(关系)与其他实体相关。每个关系包含两个描述实体类型和类型多样性的结尾(一个,零或一个,或许多)对于该关系中的两个实体。关系可以由一个引用约束来控制,该约束描述了关系中哪个结束是主要角色,哪个是依赖角色。

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