【问题标题】:Navigation property not getting filled on lazy loading延迟加载时导航属性未填充
【发布时间】:2016-06-10 10:24:56
【问题描述】:

我正在尝试我在 Mvc 官方网站上给出的 mvc 示例。 这里我有 3 个模型 Student、Course 和 Enrollment,其中 Course 和 Enrollment 实体存在一对多关系,而 Enrollment 和学生存在多对一关系。

Student、Course 和 Enrollment 的模型如下,导航属性标记为“虚拟”,因为我需要执行惰性绑定

 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 中使用代码优先技术。我的数据库上下文类如下

 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对应的数据。简而言之,导航属性是不返回数据(空)。

【问题讨论】:

  • 使用.Include() ...参考thisthis的帖子。
  • 那很好.....但是我更喜欢延迟加载。你能告诉我我哪里做错了吗。
  • 尝试修改您的 Student 类,方法是创建一个构造函数并添加以下内容 .. Enrollments = new Hashset();

标签: asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

您必须具体化实体以摆脱查询中当前的延迟加载:

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;

【讨论】:

  • 我不清楚这个答案。请您详细说明一下。这里 Find() 方法返回一个 Student 类型的对象并将其转换为 Enumerable 类型会引发编译时错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
相关资源
最近更新 更多