【发布时间】:2015-06-02 05:06:20
【问题描述】:
我正在玩一个 .Net 4.5 MVC 5 数据库第一个项目。有一个数据访问层(Entity Framework 6)、一个业务逻辑层和 MVC 层。
如果我有一个在数据层中有关系的对象:
namespace DataAccess
{
public class Course
{
public int CourseID { get; set; }
public string Title { get; set; }
public ICollection<Lecture> Lectures { get; set; }
public ICollection<Tutor> Tutors { get; set; }
}
public class Lecture
{
public int LectureID { get; set; }
public string Title { get; set; }
public DateTime Date { get; set; }
public ICollection<Student> Students { get; set; }
}
public class Tutor
{
public int TutorID { get; set; }
public string Name { get; set; }
}
public class Student
{
public int StudentID { get; set; }
public string Name { get; set; }
}
}
在我的业务逻辑层中,我有一个获取课程的方法:
namespace BusinessLogic
{
public static IEnumerable<Course> GetCourses()
{
using (var db = new MyEntities())
{
return db.Courses.Include("Lectures").Include("Lectures.Students").Include("Tutors").ToList();
}
}
}
我使用我的控制器获取数据,如下所示:
public class HomeController : Controller
{
public ActionResult Index()
{
var courses = BusinessLogic.GetCourses();
return View(courses);
}
}
为什么会这样,当我像这样在 Razor 视图中查询我的数据时:
var numLectures = courses.Lectures.Count;
var numStudents = courses.Lectures.Students.Count;
var tutorName = courses.Tutors.LastOrDefault().Name;
我收到应用程序错误System.ObjectDisposedException:ObjectContext 实例已被释放,不能再用于需要连接的操作。
我知道在 using 语句完成后连接已被释放,并且 .ToList() 将让我导航课程对象,但是如何导航每门课程中的对象(即讲座、学生、导师等)?
【问题讨论】:
-
你没有包括学生。
-
另外,您的任何导航属性都不会加载,因为它们未标记为
virtual -
我建议您将
numLectures'numStudents` 和tutorName作为 viewModel 的属性包含在控制器操作中填充的值。 -
这是使用 MVC 的正确方法吗(即使是一次性属性也可以添加属性到视图模型)?这是否意味着我应该创建一个模型,将课程、学生、讲座等分开,然后在控制器中填充讲座、学生等的模型参数,然后将模型传递给视图?
-
我错过了什么吗?由于
courses是Course的集合,它不能拥有Lectures的属性。你应该使用courses.SelectMany(c => c.Lectures).Count;之类的东西。
标签: c# asp.net-mvc-5 entity-framework-6