我正在尝试在Mvc官方网站上给出的mvc示例。 在这里,我有3个模型学生,课程和入学,其中课程和入学实体之间存在一对多的关系,并且在入学和学生方面有多对一的关系。
学生,课程和注册的模型如下,导航属性标记为"虚拟"因为我需要执行延迟绑定
public class Student
{
public int StudentID { get;set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual IEnumerable<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; }
}
我正在使用EF 5的代码优先技术。我的DB Context Class如下
public class SchoolContext:DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
通过脚手架我已经生成了我的所有视图。点击我的详细信息操作链接我有一个名为的控制器功能
public ActionResult Details(int id = 0)
{
db.Configuration.LazyLoadingEnabled = true;
db.Configuration.ProxyCreationEnabled = true;
Student student = db.Students.Find(id);
// db.Entry(student).Reference(p => p.Enrollments).Load();
IEnumerable<Enrollment> s= student.Enrollments;
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
这里的问题是当在控制器中调用Find()方法时,Student Class模型中的导航属性为null。但是DB中的数据对应于正在传递的id。简而言之,导航属性是不返回数据(null)。
答案 0 :(得分:0)
您必须具体化实体才能摆脱查询中的当前延迟加载:
Student student = db.Students.Find(id).ToList();
这将解决db.Students.Find(id)之后没有ToList()的问题; =将从动态代理返回生成的对象。
你有第二个问题:
IEnumerable<Enrollment> enrollments = student.Enrollments; // is wrong
应该是:
ICollection<State> enrollments = student.Enrollments;
或
var enrollments = student.Enrollments;