2015-06-21 69 views
1

我有一个ASP.NET MVC Code First站点。我有一个型号Teacher,它有一个列表Student s,其中每个都有一个计算属性CompletedTests。 我越来越想包含的Student是清单一个ViewModel内访问计算财产CompletedTests如果出现以下错误:MVC CodeFirst计算属性获取错误“ObjectContext实例处置”

An exception of type 'System.ObjectDisposedException' occurred in EntityFramework.dll but was not handled in user code 

Additional information: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 

老师:

public class Teacher 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Student> Students{ get; set; } 
} 

学生:

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int TeacherId { get; set; } 

    public virtual Teacher Teacher { get; set; } 

    public int TotalTests 
    { 
     get 
     { 
      return Tests.Count; 
     } 
    } 

    public int CompletedTests 
    { 
     get 
     { 
      return Tests.Count(p => p.IsCompleted); 
     } 
    } 

    public virtual ICollection<Test> Tests{ get; set; } 
} 

测试:

public class Test 
{ 
    public int Id { get; set; } 

    public int StudentId { get; set; } 

    public int QuestionsTotal 
    { 
     get 
     { 
      return Questions.Count; 
     } 
    } 

    public bool IsCompleted 
    { 
     get 
     { 
      return Questions.Count(q => q.Completed) >= QuestionsTotal; 
     } 
    } 

    public virtual Student Student { get; set; } 
    public virtual ICollection<Question> Questions{ get; set; } 
} 

问:

public class Question 
{ 
    public int Id { get; set; } 
    public int TestId { get; set; } 

    public virtual Question Question { get; set; } 
} 

HomeViewModel:

public class HomeViewModel 
{ 
    public string TeacherName { get; set; } 
    public int StudentCount { get; set; } 
    public IEnumerable<Student> Students { get; set; } 
} 

首页控制器:

public ActionResult Index() 
{ 
    var model = new HomeViewModel(); 
    var userId = User.Identity.GetUserId(); 
    using (var context = new ApplicationDbContext()) 
    { 
     var teacher = context.Teachers.FirstOrDefault(c => c.IdentityId == userId); 
     if (teacher != null) 
     { 
      model.TeacherName = teacher.Name; 
      model.Students = teacher.Students.ToList(); 
     } 
     return View(model); 
    } 
} 

Index.cshtml部分:

 <tbody> 
      @foreach (var student in Model.Students) 
      { 
       <tr> 
        <td> 
         @student.Name 
        </td> 
        <td> 
         @(student.CompletedTests + "/" + student.TotalTests) 
        </td> 
       </tr> 
      } 
     </tbody> 

难道有人请指出为什么我在student.CompletedTests部件上收到处置的实例错误?

+0

我看不到你在哪里得到老师或学生的名字。您只有'Test'中的'Name'字段。 –

+0

对不起,有错的课。它在'Student'上,而不是'Test'。 – Marcus

+0

'teacher.Name'呢? –

回答

1

使用包括加载学生的实体时避免延迟加载,包括测试实体:

model.Students = teacher.Students.Include(t => t.Tests).ToList(); 

这就是所谓的预先加载:

https://msdn.microsoft.com/en-us/data/jj574232.aspx

你得到的错误是因为ObjectContext的(ApplicationDbContext)在您的视图中不再可用。它已经置于控制器的方法内部。