MVC CodeFirst 计算 属性 出现错误 "ObjectContext instance disposed"
MVC CodeFirst Calculated Property getting error "ObjectContext instance disposed"
我有一个 ASP.NET MVC Code First 站点。我有一个模型 Teacher
,它有一个 Student
的列表,每个列表都有一个计算的 属性 CompletedTests
。
尝试从包含 Student
s 列表的 ViewModel 中访问计算的 属性 CompletedTests
时出现以下错误:
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
部分收到处置实例错误吗?
在加载 Student 实体时使用 Include 来包含 Tests 实体以避免延迟加载:
model.Students = teacher.Students.Include(t => t.Tests).ToList();
这称为预先加载:
https://msdn.microsoft.com/en-us/data/jj574232.aspx
您收到的错误是因为 ObjectContext (ApplicationDbContext) 在您的视图中不再可用。它已经在控制器的方法中进行了处理。
我有一个 ASP.NET MVC Code First 站点。我有一个模型 Teacher
,它有一个 Student
的列表,每个列表都有一个计算的 属性 CompletedTests
。
尝试从包含 Student
s 列表的 ViewModel 中访问计算的 属性 CompletedTests
时出现以下错误:
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
部分收到处置实例错误吗?
在加载 Student 实体时使用 Include 来包含 Tests 实体以避免延迟加载:
model.Students = teacher.Students.Include(t => t.Tests).ToList();
这称为预先加载:
https://msdn.microsoft.com/en-us/data/jj574232.aspx
您收到的错误是因为 ObjectContext (ApplicationDbContext) 在您的视图中不再可用。它已经在控制器的方法中进行了处理。