MVC CodeFirst计算属性获取错误" ObjectContext实例已处理"

时间:2015-06-21 20:54:14

标签: c# asp.net asp.net-mvc ef-code-first

我有一个ASP.NET MVC Code First站点。我有一个模型Teacher,其中包含Student个列表,每个列表都有一个计算属性CompletedTests。 尝试从包含CompletedTests s列表的ViewModel中访问计算属性Student时,我收到以下错误:

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部分收到处理后的实例错误?

1 个答案:

答案 0 :(得分:1)

使用Include在加载Student实体时包含Tests实体以避免延迟加载:

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

这称为预先加载:

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

您获得的错误是因为您的视图中不再提供ObjectContext(ApplicationDbContext)。它已经被置于控制器的方法中。