我对EF asp.net mvc中的代码第一个逻辑感到有些困惑。 asp.net页面上的示例说明了这个数据库结构
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设置中使用它?
答案 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