欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

mvc中使用ef(五):在 asp.net mvc 程序使用entity framework读取关联数据

更新时间: 2014-01-05 01:50:09 责任编辑: Author_N1

 

MVC中使用EF(5):在 ASP.NET MVC 程序使用Entity Framework读取关联数据

运行查看效果

Instructors_index_page_with_instructor_selected

在刚添加的代码之后再添加如下代码,显示被选中课程的学生登记信息

@if (Model.Enrollments != null) 
{ 
    <h3> 
        Students Enrolled in Selected Course</h3> 
    <table> 
        <tr> 
            <th>Name</th> 
            <th>Grade</th> 
        </tr> 
        @foreach (var item in Model.Enrollments) 
        { 
            <tr> 
                <td> 
                    @item.Student.FullName 
                </td> 
                <td> 
                    @Html.DisplayFor(modelItem => item.Grade) 
                </td> 
            </tr> 
        } 
    </table> 
}

代码读取视图模型的 Enrollments 属性列出选中课程的学生登记信息.

运行查看效果

Instructors_index_page_with_instructor_and_course_selected

添加显式加载

打开 InstructorController.cs 查看 Index如何获取选中课程的登记信息:

    if (courseID != null)
    {
        ViewBag.CourseID = courseID.Value;
        viewModel.Enrollments = viewModel.Courses.Where(
            x => x.CourseID == courseID).Single().Enrollments;
    }

在检索教师列表的时候,渴望加载模式检索了 Courses 导航属性及其相关的 Department 属性.然后把 Courses 集合载入视图模型,现在访问此集合中某实体的 Enrollments导航属性.由于没有渴望加载 Course.Enrollments导航属性,此属性使用延迟加载模式.

如果禁用了延迟加载而没有修改此部分代码,Enrollments 属性将为null,即便数据库中有相关数据.这样需要使用渴望加载或显式加载 Enrollments 属性。之前已经使用了渴望加载,这里使用显式加载修改 Index 方面,获取Enrollments 属性.

public ActionResult Index(int? id, int? courseID)
{
    var viewModel = new InstructorIndexData();

    viewModel.Instructors = db.Instructors
        .Include(i => i.OfficeAssignment)
        .Include(i => i.Courses.Select(c => c.Department))
        .OrderBy(i => i.LastName);

    if (id != null)
    {
        ViewBag.InstructorID = id.Value;
        viewModel.Courses = viewModel.Instructors.Where(
            i => i.InstructorID == id.Value).Single().Courses;
    }
    
    if (courseID != null)
    {
        ViewBag.CourseID = courseID.Value;
        var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
        db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
        foreach (Enrollment enrollment in selectedCourse.Enrollments)
        {
            db.Entry(enrollment).Reference(x => x.Student).Load();
        }

        viewModel.Enrollments = selectedCourse.Enrollments;
    }

    return View(viewModel);
}

获取选中 Course 实体之后, t显式加载课程的 Enrollments 导航属性

db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();

显示加载 Enrollment 实体相关的 Student 实体:

db.Entry(enrollment).Reference(x => x.Student).Load();

注意使用 Collection 方法加载集合属性,Reference 方法加载单个实体属性.

运行查看效果.

总结

使用三种方式(延迟、渴望、显式)加载相关的导航属性。下一节将学习如何更新相关联的数据。

其它 EntityFramework资源请查看 ASP.NET Data Access Content Map.

上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 01:50:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/1769/
本文WWW.DOC100.NET DOC100.NET版权所有。