EF学习笔记:读取关联数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF学习笔记:读取关联数据相关的知识,希望对你有一定的参考价值。

总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理)

本篇参考原文链接:Reading Related Data

本章主要讲述加载显示关联数据;

数据加载分为以下三种

  Lazy loading

  这种加载方式在于需要用到这个导航属性数据的时候,才会去数据库取数据,如下图,循环中,每一次都去数据库取一次数据:

  技术分享

  Eager loading

  这种加载方式则是先定义好哪个导航属性数据需要一起加载(通过是.Inclue),然后在加载主数据的时候,一并把导航数据全部加载,如下图:

  技术分享

  Explicit loading

  这种加载就是需要明确用代码来定义去数据库取数据(通过Collection.Load()或者Reference.Load()),一般是用在Lazy Loading 被关闭的情况下;如:

  技术分享

性能考虑

  显而易见,Lazy Loading和Eager Loading 各有优势劣势;

  Lazy Loading可以在需要的时候才取数据,那么不需要的时候就节约了资源;但需要的时候也对数据库产生了很大压力;

  Eager Loading可以在需要的时候一次性取到全部数据,对于数据库压力来说会好很多;

  所以,根据自己需要选择哪一种咯。。。

序列化之前关闭Lazy Loading

  如果要序列化一个实体,会出现导航属性一层一层展下去,出现循环等等问题,所以在WEB API或者特定应用场景下需要序列化实例的时候,需要做些特殊处理;

       准备深入学习此部分;计划后续再补充这部分;

新建Course页面来显示包含Department

  技术分享

这次偷偷懒,直接用带View 使用EF的控制器模板来创建Course控制器:

  技术分享

在控制器里,Index Action 已经直接把Department导航属性加载了:

        // GET: Courses
        public ActionResult Index()
        {
            var courses = db.Courses.Include(c => c.Department);
            return View(courses.ToList());
        }

然后把Courses/Index 试图改为:
(注意:个人偷懒,创建控制器的时候,Course控制器被自动创建为CoursesController, 所以要手动改下Home/Index里对应Course的Action Link参数)

(另外:要Department标题显示Department 而不是Name ,则需要到Department模型里把Name这个属性加上 [Display(Name ="Department")]

@model IEnumerable<EFTest.Models.Course>

@{
    ViewBag.Title = "Courses";
}

<h2>Courses</h2>

<p>
    @html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.CourseID)
        </th>        
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Credits)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Department.Name)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.CourseID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Credits)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Department.Name)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.CourseID }) |
            @Html.ActionLink("Details", "Details", new { id=item.CourseID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.CourseID })
        </td>
    </tr>
}

</table>

技术分享

新建Instructors列表显示页面

 


以上是关于EF学习笔记:读取关联数据的主要内容,如果未能解决你的问题,请参考以下文章

EF添加关联的提示问题:映射从第 260 行开始的片段时有问题:

EF学习笔记:异步处理和存储过程

EF6学习笔记

AngularJS入门学习笔记一

AngularJS的学习笔记

Spark基础学习笔记26:Spark SQL数据源 - JSON数据集