<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_冠军</title><subtitle type="text">思胜.NET 高级培训</subtitle><id>http://feed.cnblogs.com/blog/u/17033/rss</id><updated>2012-05-28T15:15:59Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/17033/rss"/><entry><id>http://www.cnblogs.com/haogj/archive/2012/05/05/2484663.html</id><title type="text">翻译：Contoso 大学 - 10 - 高级 EF 应用场景</title><summary type="text">这个教程涵盖下列主题：执行原始的 SQL 查询执行没有跟踪的查询检查发送到数据库的查询使用代理类禁用修改的自动检测在保存修改时禁用验证</summary><published>2012-05-05T05:09:00Z</published><updated>2012-05-05T05:09:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/05/05/2484663.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/05/05/2484663.html"/><content type="html">&lt;p&gt;By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform &amp;amp; Tools Content Team.&lt;br /&gt;&lt;br /&gt;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application" target="_blank"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application&lt;/a&gt;&lt;br title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application" /&gt;全文目录：&lt;a title="Contoso 大学 - 使用 EF Code First 创建 MVC 应用" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html" target="_blank"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在上一个教程中，你已经实现了仓储和工作单元模式。这个教程涵盖下列主题：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;执行原始的 SQL 查询&lt;/li&gt;&lt;li&gt;执行没有跟踪的查询&lt;/li&gt;&lt;li&gt;检查发送到数据库的查询&lt;/li&gt;&lt;li&gt;使用代理类&lt;/li&gt;&lt;li&gt;禁用修改的自动检测&lt;/li&gt;&lt;li&gt;在保存修改时禁用验证&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;多数内容使用你已经创建的页面。为了使用原始的 SQL 进行批更新，你需要创建一个新的更新数据库中所有课程学分的页面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578167/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Update_Course_Credits_initial_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;以及在 Department 编辑页面中增加新的验证逻辑，使用非跟踪的查询。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578173/Department.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-1&amp;nbsp; 执行原始的 SQL 查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 EF 中包含有允许你直接将 SQL 命令发送到数据库的 API 方法，你有以下选择：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;使用 DbSet.SqlQuery 方法进行查询以返回实体类型。返回的对象类型必须是 DbSet 对象期望的类型。除非你关掉追踪，数据库上下文将自动追踪。( 查看随后关于 AsNoTracking 方法 )&lt;/li&gt;&lt;li&gt;使用 DbDatabase.SqlQuery 方法进行查询，返回类型不是实体。返回的数据不会被数据库上下文追踪，即使使用这个方法获取实体类型。&lt;/li&gt;&lt;li&gt;使用 DbDatabase.SqlCommand 用于非查询命令。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;使用 EF 的好处是使你不用过分关注处理存储数据的特定方法。它通过自动生成需要的查询命令来完成，这样你就不用亲自编写这些代码。但是，一个例外就是你可能需要执行手动创建的特殊命令，这些方法可以为你处理类似的意外场景。&lt;br /&gt;在 Web 中执行 SQL 命令有一点总是对的，你必须注意保护你的站点免于 SQL 注入攻击。一种方法就是使用参数化查询来防止提交的命令没有被注入。在这个教程中，在使用用户的输入生成查询的时候将会使用参数化查询。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-1-1 调用返回实体的查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假设你希望 GenericRepository 类需要提供一个额外的过滤和排序灵活方法，而不需要你创建一个派生类，然后增加一个额外的方法。一种方法就是增加一个接受原始 SQL 命令的方法。这样你就可以在控制其中指定任何类型的过滤和排序处理。比如 Where 子句依赖于连接或者子查询。 在这一节中，你将要看到如何实现这样的方法。&lt;br /&gt;通过将如下代码增加到 GenericRepository.cs 中， 创建 GetWithRawSql 方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; IEnumerable&amp;lt;TEntity&amp;gt; GetWithRawSql(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; query, &lt;span style="color: #0000ff;"&gt;params&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] parameters)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; dbSet.SqlQuery(query, parameters).ToList();&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 CourseController.cs 中，在 Details 方法中调用新的方法，如下所示：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Details(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; query = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT * FROM Course WHERE CourseID = @p0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(unitOfWork.CourseRepository.GetWithRawSql(query, id).Single());&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在这里，你可以使用 GetByID 方法，但是，通过调用 GetWithSql 方法来验证 GetWithRawSQL 方法正常工作。&lt;br /&gt;运行 Details 页面，验证选择查询正确工作 ( 选择 Course 窗格，然后选择某个课程的 Details&amp;nbsp; )&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578179/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Course_Details_page.png" alt="" width="638" height="750" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-1-2&amp;nbsp; 调用查询返回其它类型的对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;早前的时候，你创建过一个关于页面，其中显示了每个注册日注册学生的数量。位于 HomeController.cs 中的代码使用 LINQ 完成。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; data = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; student &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; db.Students&lt;br/&gt;           group student by student.EnrollmentDate into dateGroup&lt;br/&gt;           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; EnrollmentDateGroup()&lt;br/&gt;           {&lt;br/&gt;               EnrollmentDate &lt;/span&gt;=&lt;span style="color: #000000;"&gt; dateGroup.Key,&lt;br/&gt;               StudentCount &lt;/span&gt;=&lt;span style="color: #000000;"&gt; dateGroup.Count()&lt;br/&gt;           };&lt;/span&gt;&lt;/div&gt;&lt;p&gt;假设你希望通过借助编写的 SQL 而不是使用 LINQ 来获取这些数据。要做到这个目的，你需要执行返回一些其他数据而不是实体对象的查询语句，这意味着你需要使用 Database.SqlQuery 方法。&lt;br /&gt;在 HomeController.cs 中，使用下面的代码替换原来 About 方法中的 LINQ。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; query = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT EnrollmentDate, COUNT(*) AS StudentCount &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;    + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FROM Person &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;    + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WHERE EnrollmentDate IS NOT NULL &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br/&gt;    + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GROUP BY EnrollmentDate&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; data = db.Database.SqlQuery&amp;lt;EnrollmentDateGroup&amp;gt;(query);&lt;/div&gt;&lt;p&gt;运行 About 页面，它会像从前一样显示出来。&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578185/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_About_page_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-1-3&amp;nbsp; 调用更新查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假设 Contoso 大学的管理员希望能够在数据库中执行批量更新，例如修改每门课程的学分。如果大学有大量的课程，就意味着需要低效率地获取全部的课程实体，然后一个一个修改，在这一节中，你将要实现一个 Web 页面，允许用户设定所有课程的学分，通过执行一个 SQL 的更新 UPDATE 语句完成。这个页面如下图所示。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578191/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Update_Course_Credits_initial_page_1.png" alt="" width="628" height="370" /&gt;&lt;/p&gt;&lt;p&gt;在 Course 控制器中，以前你已经使用泛型的仓储来读取和更新课程实体。这与这次的批更新处理，需要创建一个不在泛型仓储中的新仓储方法。为了达到这个目的，你需要创建一个派生自 GenericRepository 基类的派生类 CourseRepository 。&lt;br /&gt;在 DAL 文件夹中，创建 CourseRepository.cs ，使用下面的代码替换生成的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; CourseRepository : GenericRepository&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; CourseRepository(SchoolContext context)&lt;br/&gt;            : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;(context)&lt;br/&gt;        {&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; UpdateCourseCredits(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; multiplier)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; context.Database.ExecuteSqlCommand(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UPDATE Course SET Credits = Credits * {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, multiplier);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 UnitOfWork.cs 中，将 Course 仓储类型从 GenericRepository&amp;lt; Course &amp;gt; 修改为 CourseRepository:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; CourseRepository courseRepository;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; CourseRepository CourseRepository&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.courseRepository == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.courseRepository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CourseRepository(context);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; courseRepository;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 CourseController.cs 中，增加 UpdateCourseCredits 方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult UpdateCourseCredits(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;?&lt;span style="color: #000000;"&gt; multiplier)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (multiplier != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        ViewBag.RowsAffected &lt;/span&gt;=&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.UpdateCourseCredits(multiplier.Value);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这个方法将会同时用于 HttpGet 和 HttpPost 。当调用 GET 方式的 UpdateCourseCredits 方法的时候，变量 multiplier 会是 null，视图将会显示空的文本框和提交按钮，如前所示。&lt;br /&gt;当 Update 按钮被点击之后，将会以 POST 方式调用方法。Multiplier 将会得到在文本框中输入的值。代码调用仓储的 UpdateCourseCredits 方法，方法返回受到影响的行数，这个值存储在 ViewBag 对象中。视图通过 ViewBag 获取受到影响的行数，它将显示这个数字而不是文本框和提交按钮，如下图所示。&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578197/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Update_Course_Credits_rows_affected_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;在 View\Course 文件夹中创建一个用来更新课程学分的视图。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578203/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Add_View_dialog_box_for_Update_Course_Credits.png" alt="" width="541" height="535" /&gt;&lt;/p&gt;&lt;p&gt;在&amp;nbsp; View\Course\UpdateCourseCredits.cshtml 中，使用下面的代码替换原有代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;@model ContosoUniversity.Models.Course&lt;br/&gt;&lt;br/&gt;@{&lt;br/&gt;    ViewBag.Title &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UpdateCourseCredits&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&amp;lt;h2&amp;gt;Update Course Credits&amp;lt;/h2&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&lt;br/&gt;@if (ViewBag.RowsAffected &lt;/span&gt;== &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Html.BeginForm())&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&amp;lt;p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            Enter a number to multiply every course&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s credits by: @Html.TextBox("multiplier")&lt;/span&gt;&lt;br/&gt;        &amp;lt;/p&amp;gt;&lt;br/&gt;        &amp;lt;p&amp;gt;&lt;br/&gt;            &amp;lt;input type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;submit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; value=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Update&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br/&gt;        &amp;lt;/p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;@if (ViewBag.RowsAffected &lt;/span&gt;!= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&amp;lt;p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        Number of rows updated: @ViewBag.RowsAffected&lt;br/&gt;    &lt;/span&gt;&amp;lt;/p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&amp;lt;div&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Back to List&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;通过选择 Course 窗格运行页面，然后增加 &amp;ldquo;/UpdateCourseCredits&amp;rdquo;&amp;nbsp; 到浏览器地址栏中，( 例如：http://localhost:50205/Course/UpdateCourseCredits&amp;nbsp; )。在文本框中输入一个数字。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578209/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Update_Course_Credits_initial_page_with_2_entered.png" alt="" width="673" height="396" /&gt;&lt;/p&gt;&lt;p&gt;点击 Update，你会看到受影响的行数。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578215/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Update_Course_Credits_rows_affected_page_1.png" alt="" width="673" height="396" /&gt;&lt;/p&gt;&lt;p&gt;点击 Back to List 查看修订之后的课程学分列表。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578221/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Courses_Index_page_showing_revised_credits.png" alt="" width="648" height="681" /&gt;&lt;/p&gt;&lt;p&gt;关于执行原始查询的更多内容，请查阅 EF 团队博客的 Raw SQL Queries&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-2&amp;nbsp; 非追踪的查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当数据库上下文从数据库获取数据行然后表示为实体的时候，默认情况下，会保持对内存中实体对象是否与数据库中数据同步的追踪。内存中的数据作为缓存，当你更新实体的时候被用来更新。这个缓存在 Web 应用程序中通常没有必要，因为上下文对象的实例生命期很短 ( 对于每一次请求创建一个新的，然后释放 ) ，在实体被再次使用之前数据库上下文读取的实体对象已经被释放了。&lt;br /&gt;你可以通过 AsNoTracking 方法来指定上下文对象是否追踪实体对象。使用这个方法常见的场景如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;对于查询大量数据的查询来说，关闭追踪可以提高性能。&lt;/li&gt;&lt;li&gt;你更希望重新连接一个对象用来更新，尽管基于不同的目的以前获取过同样的对象。由于数据库上下文已经追踪了这个实体，你就不能连接你希望修改的实体。防止出现这种情况的一种方式就是在原来的查询中使用 AsNoTracking 选项。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在这一节，你将要实现演示第二种场景的业务逻辑。具体来说，希望确认强制的业务规则：一个教师不能成为多个系的管理员。&lt;br /&gt;在 DepartmentController.cs 中，增加一个可以在 Edit 和 Create 方法中调用的方法，确认两个系不能有同一个的管理员。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; ValidateOneAdministratorAssignmentPerInstructor(Department department)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (department.PersonID != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; duplicateDepartment =&lt;span style="color: #000000;"&gt; db.Departments&lt;br/&gt;            .Include(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Administrator&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            .Where(d &lt;/span&gt;=&amp;gt; d.PersonID ==&lt;span style="color: #000000;"&gt; department.PersonID)&lt;br/&gt;            .FirstOrDefault();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (duplicateDepartment != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; duplicateDepartment.DepartmentID !=&lt;span style="color: #000000;"&gt; department.DepartmentID)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; errorMessage =&lt;span style="color: #000000;"&gt; String.Format(&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Instructor {0} {1} is already administrator of the {2} department.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                duplicateDepartment.Administrator.FirstMidName,&lt;br/&gt;                duplicateDepartment.Administrator.LastName,&lt;br/&gt;                duplicateDepartment.Name);&lt;br/&gt;            ModelState.AddModelError(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty, errorMessage);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;增加在 HttpPost Edit 方法中的 try 代码块，如果经过验证的话，调用新的方法。Try 代码块如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;{&lt;br/&gt;    ValidateOneAdministratorAssignmentPerInstructor(department);&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;{&lt;br/&gt;    db.Entry(department).State &lt;/span&gt;=&lt;span style="color: #000000;"&gt; EntityState.Modified;&lt;br/&gt;    db.SaveChanges();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;运行 Department 的 Edit 页面，试着将已经是某个系管理员的教师设置为其他系的管理员。你会得到期望中的错误信息。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578173/Department.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;再次运行 Department 的 Edit 页面，这一次修改 Budget ，当点击 Save 的时候，你会看到如下信息。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578233/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Department_Edit_page_with_object_state_manager_error_message.png" alt="" width="651" height="404" /&gt;&lt;/p&gt;&lt;p&gt;异常提示信息是 &amp;ldquo;An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.&amp;rdquo; 这是因为顺序发生了一下事件：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Edit 方法调用 ValidateOneAdministratorAssignmentPerInstructor 方法，这导致获取了 Kim Abercrombie 作为管理员的所有 Department 。结果是名为 English 的 Department 被读取到内存中。因为这个 Department 被编辑了，不会有错误报告，作为这次读取操作的结果，然而，从数据库读取的 English Department 实体已经被数据库上下文跟踪了。&lt;/li&gt;&lt;li&gt;Edit 方法试图设置通过模型绑定得到的 English Department 实体的 Modified 标志，但是失败了，因为数据库上下文已经跟踪了 English 实体。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;解决这个问题的一个方案是保持数据库上下文，从内存中获取跟踪的 Department 实体。这样做没有什么好处，因为并不需要更新这个实体或者通过从内存中再次读取这个实体来获取好处。&lt;br /&gt;在 DepartmentController.cs 文件的 ValidateOneAdministratorAssignmentPerInstructor 方法中，指定不需要跟踪，如下所示：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; duplicateDepartment =&lt;span style="color: #000000;"&gt; db.Departments&lt;br/&gt;   .Include(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Administrator&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;   .Where(d &lt;/span&gt;=&amp;gt; d.PersonID ==&lt;span style="color: #000000;"&gt; department.PersonID)&lt;br/&gt;   .AsNoTracking()&lt;br/&gt;   .FirstOrDefault();&lt;/span&gt;&lt;/div&gt;&lt;p&gt;重新编辑Department 的 Budget 。这次操作成功了。站点返回了预期的 Department Index 页面，显示了修改之后的 Budget 值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;10-3&amp;nbsp; 检查发送到数据库的查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有的时候，能够看到实际发送到数据库的 SQL 很有帮助，如果希望的话，可以通过在调试器中检查查询变量或者调用查询的 ToString 方法。尝试一下，对一个简单的查询增加一些选项，例如预先加载，过滤和排序等等，看看发生了什么。&lt;br /&gt;在 Controller/CourseController.cs 中，使用下面的代码替换 Index 方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ViewResult Index()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; courses =&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.Get();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(courses.ToList());&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;现在，在 GenericRepository.cs 文件中GET 方法的 return query.ToList() 方法调用语句以及 orderBy( query ).ToList() 语句上增加一个断点，在调试模式运行项目，选择 Course 的 Index 页面。当执行到断点的时候，检查 query 变量。你就会看到发送到数据库的 SQL 语句。是简单的 Select 语句。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;{SELECT &lt;br/&gt;[Extent1].[CourseID] AS [CourseID], &lt;br/&gt;[Extent1].[Title] AS [Title], &lt;br/&gt;[Extent1].[Credits] AS [Credits], &lt;br/&gt;[Extent1].[DepartmentID] AS [DepartmentID]&lt;br/&gt;FROM [Course] AS [Extent1]}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 Visual Studio 的调试器窗口中，查询语句可能很长，不便于显示出来。为了查看完整的查询，你可以复制变量的值粘贴到文本编辑器中。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578239/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Copy_value_of_variable_in_debug_mode_0902a2b1-b799-47a6-9b4b-f266c79d83c1.png" alt="" width="643" height="202" /&gt;&lt;/p&gt;&lt;p&gt;现在你需要为 Course 的 Index 页面上增加一个下拉列表，用户可以用来过滤特定的 Department。通过标题可以进行排序，对 Department 导航属性使用贪婪加载，在 CourseController.cs 文件中，使用下面的代码替换原有内容。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;?&lt;span style="color: #000000;"&gt; SelectedDepartment)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; departments =&lt;span style="color: #000000;"&gt; unitOfWork.DepartmentRepository.Get(&lt;br/&gt;        orderBy: q &lt;/span&gt;=&amp;gt; q.OrderBy(d =&amp;gt;&lt;span style="color: #000000;"&gt; d.Name));&lt;br/&gt;    ViewBag.SelectedDepartment &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SelectList(departments, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DepartmentID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, SelectedDepartment);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; departmentID =&lt;span style="color: #000000;"&gt; SelectedDepartment.GetValueOrDefault(); &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(unitOfWork.CourseRepository.Get(&lt;br/&gt;        filter: d &lt;/span&gt;=&amp;gt; !SelectedDepartment.HasValue || d.DepartmentID ==&lt;span style="color: #000000;"&gt; departmentID,&lt;br/&gt;        orderBy: q &lt;/span&gt;=&amp;gt; q.OrderBy(d =&amp;gt;&lt;span style="color: #000000;"&gt; d.CourseID),&lt;br/&gt;        includeProperties: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Department&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这个方法通过 SelectedDepartment 参数获取下拉列表中的选中的值。如果没有任何项目选中，参数为 null。&lt;br /&gt;SelectList 集合中包含传递到视图的下拉列表中的 Department。传递给 SelectList 构造器的参数设置了字段名称，文本域名称，以及选中的项目。&lt;br /&gt;对于 Course 仓储的 Get 方法来说，代码设置了过滤表达式，排序顺序，预先加载 Department 导航属性。如果下拉列表没有选中的话，过滤表达式总是返回 true ( 也就是说 SelectedDepartment 是 null&amp;nbsp; )。&lt;br /&gt;在 View\Course\Index.cshtml 中，在 table 开始标记之前，增加如下的代码创建下拉列表和提交按钮。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;@using (Html.BeginForm())&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&amp;lt;p&amp;gt;Select Department: @Html.DropDownList(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SelectedDepartment&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;All&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)   &lt;br/&gt;    &lt;/span&gt;&amp;lt;input type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;submit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; value=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Filter&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&amp;lt;/p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;由于在 GenericRepository 类的断点仍然有效，运行 Course 的 Index 页面，重复上次的操作以命中断点，在浏览器显示页面之后，从下拉列表中选中一个 Department，然后点击 Filter。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578245/Windows-Live-Writer_Advanced-Entity-Framework-Scenarios-for-_CEF8_Course_Index_page_with_department_selected_c4e77b79-47a1-4f4b-9e65-f43b69b8be07.png" alt="" width="645" height="737" /&gt;&lt;/p&gt;&lt;p&gt;这一次第一个断点出现在下拉列表查询 Department 的时候，跳过之后，在下次代码到达断点的时候，查看 query 变量中的 Course 查询，你应该看到类似如下的查询语句。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;{SELECT &lt;br/&gt;[Extent1].[CourseID] AS [CourseID], &lt;br/&gt;[Extent1].[Title] AS [Title], &lt;br/&gt;[Extent1].[Credits] AS [Credits], &lt;br/&gt;[Extent1].[DepartmentID] AS [DepartmentID], &lt;br/&gt;[Extent2].[DepartmentID] AS [DepartmentID1], &lt;br/&gt;[Extent2].[Name] AS [Name], &lt;br/&gt;[Extent2].[Budget] AS [Budget], &lt;br/&gt;[Extent2].[StartDate] AS [StartDate], &lt;br/&gt;[Extent2].[PersonID] AS [PersonID], &lt;br/&gt;[Extent2].[Timestamp] AS [Timestamp]&lt;br/&gt;FROM  [Course] AS [Extent1]&lt;br/&gt;INNER JOIN [Department] AS [Extent2] ON [Extent1].[DepartmentID] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; [Extent2].[DepartmentID]&lt;br/&gt;WHERE (@p__linq__0 IS NULL) OR ([Extent1].[DepartmentID] &lt;/span&gt;= @p__linq__1)}&lt;/div&gt;&lt;p&gt;你会看到现在是联合查询，通过Where 子句，依据 Course 数据加载了 Department 数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10.4&amp;nbsp; 使用代理类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当 EF 创建实体对象的时候 ( 例如，在执行查询的时候 )，EF 经常会创建动态生成的派生自实体的代理对象。代理重写了实体的虚拟属性来插入在访问属性的时候自动执行的钩子。例如，这种机制用来支持延迟加载或者关联。&lt;br /&gt;多数时候你并不能察觉使用了代理，除了下面的情况之外：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;有一些场景，你需要阻止 EF 创建代理实例。例如，序列化非代理的对象实例可能比序列化代理对象实例更加有效。&lt;/li&gt;&lt;li&gt;当使用 new 操作符实例化实体的时候，你并没有得到代理实例。这意味着你不能获得诸如延迟加载以及自动追踪的能力。一般没有问题，通常并不需要延迟加载，因为你在创建数据库中并不存在的实体。在将实体标记为 Added 状态的时候，也不需要追踪。然而，如果你需要延迟加载，需要改变追踪，就可以通过 DbSet 类的 Create 方法来创建实体代理对象。&lt;/li&gt;&lt;li&gt;可能需要通过代理类型对象实例获取真实实体类型。可以使用 ObjectContext 类的 GetObjectType 方法来通过代理对象获取实际对象。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;更多信息，参看 EF 团队博客的 Working with Proxies&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10.5&amp;nbsp; 禁用变化自动跟踪&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;EF 通过比较实体的当前值与原始值来决定实体如何变化 ( 依此来决定发送到数据库的更新 )。在查询或者连接的时候原始值被保存起来。导致自动变化跟踪监测的一些方法如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;DbSet.Find&lt;/li&gt;&lt;li&gt;DbSet.Local&lt;/li&gt;&lt;li&gt;DbSet.Remove&lt;/li&gt;&lt;li&gt;DbSet.Add&lt;/li&gt;&lt;li&gt;DbSet.Attach&lt;/li&gt;&lt;li&gt;DbContext.SaveChanges&lt;/li&gt;&lt;li&gt;DbContext.GetValidationErrors&lt;/li&gt;&lt;li&gt;DbContext.Entry&lt;/li&gt;&lt;li&gt;DbChangeTracker.Entries&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果你跟踪大量的实体，而且在循环中多次调用上面提到的方法，通过使用 AutoDetectChangesEnabled 属性暂时关闭变化检测，可以得到显著的性能提升，更多信息，参见 EF 团队博客的 Automatically Detecting Changes。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-6&amp;nbsp; 在保存的时候禁用验证&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在调用 SaveChanges 方法的时候，在更新到数据库之前，EF 验证所有被修改实体的数据的所有属性。如果你更新了大量的实体，而且你已经验证了数据，这些工作就是不必要的，通过 ValidateOnSaveEntity 属性临时关闭验证可以花费更要的时间保存修改。更多信息，参见 EF 团队博客的 Validation。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10-7&amp;nbsp; EF 资源链接&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;更多地 EF 资源，参见如下资源：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg696172%28VS.103%29.aspx"&gt;Introduction to the Entity Framework 4.1 (Code First)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg696095%28VS.103%29.aspx"&gt;The Entity Framework Code First Class Library API Reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/entity-framework-faq.aspx"&gt;Entity Framework FAQ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/"&gt;The Entity Framework Team Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb399572.aspx"&gt;Entity Framework in the MSDN Library&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/data/ef"&gt;Entity Framework in the MSDN Data Developer Center&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/"&gt;Entity Framework Forums on MSDN&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thedatafarm.com/blog/"&gt;Julie Lerman's blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/gg193958"&gt;Code First DataAnnotations Attributes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.asp.net/entity-framework/tutorials/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application"&gt;Maximizing Performance with the Entity Framework in an ASP.NET Web Application&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/gg490349.aspx"&gt;Profiling Database Activity in the Entity Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx"&gt;Entity Framework Power Tools&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;下面的 EF 团队的博客提供了教程涉及的更多资源。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx"&gt;Fluent API Samples&lt;/a&gt;. How to customize mapping using fluent API method calls.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-2-connections-and-models.aspx"&gt;Connections and Models&lt;/a&gt;. How to connect to different types of databases.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/10/ef-feature-ctp5-pluggable-conventions.aspx"&gt;Pluggable Conventions&lt;/a&gt;. How to change conventions.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/28/using-dbcontext-in-ef-feature-ctp5-part-3-finding-entities.aspx"&gt;Finding Entities&lt;/a&gt;. How to use the &lt;code&gt;Find&lt;/code&gt; method with composite keys.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx"&gt;Loading Related Entities&lt;/a&gt;. Additional options for eager, lazy, and explicit loading.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx"&gt;Load and AsNoTracking&lt;/a&gt;. More on explicit loading.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;一些这里提到的博客是关于 CTP 版本的 EF Code First，多数资料是准确的，但是在正式发布版本中会有一些变化。&lt;br /&gt;在 EF 中使用 LINQ 的信息，参见 MSDN 的 &lt;a href="http://msdn.microsoft.com/en-us/library/bb386964.aspx"&gt;LINQ to Entities&lt;/a&gt;&lt;br /&gt;使用 MVC 和 EF 的更多信息，参见 &lt;a href="http://www.asp.net/mvc/tutorials/mvc-music-store-part-1"&gt;MVC Music Store&lt;/a&gt;.&lt;br /&gt;在项目创建之后，如何发布的问题，参见 MSDN 的 &lt;a href="http://msdn.microsoft.com/en-us/library/bb386521.aspx"&gt;ASP.NET Deployment Content&lt;/a&gt; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2484663.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/05/05/2484663.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/05/01/2476595.html</id><title type="text">翻译：Contoso 大学 - 9 - 实现仓储和工作单元模式</title><summary type="text">在上一次的教程中，你已经使用继承来消除在 Student 和 Instructor 实体之间的重复代码。在这个教程中，你将要看到使用仓储和工作单元模式进行增、删、改、查的一些方法。像前面的教程一样，你将要修改已经创建的页面中代码的工作方式，而不是新创建的页面。</summary><published>2012-05-01T13:38:00Z</published><updated>2012-05-01T13:38:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/05/01/2476595.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/05/01/2476595.html"/><content type="html">&lt;p&gt;By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform &amp;amp; Tools Content Team.&lt;br /&gt;&lt;br /&gt;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application" target="_blank"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application&lt;/a&gt;&lt;br title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application" /&gt;全文目录：&lt;a title="Contoso 大学 - 使用 EF Code First 创建 MVC 应用" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html" target="_blank"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在上一次的教程中，你已经使用继承来消除在 Student 和 Instructor 实体之间的重复代码。在这个教程中，你将要看到使用仓储和工作单元模式进行增、删、改、查的一些方法。像前面的教程一样，你将要修改已经创建的页面中代码的工作方式，而不是新创建的页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-1&amp;nbsp; 仓储和工作单元模式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;仓储和工作单元模式用来在数据访问层和业务逻辑层之间创建抽象层。实现这些模式有助于隔离数据存储的变化，便于自动化的单元测试或者测试驱动的开发 ( TDD )。&lt;br /&gt;在这个教程中，你将要为每个实体类型实现一个仓储类。对于 Student 实体来说，你需要创建一个仓储接口和一个仓储类。当在控制器中实例化仓储对象的时候。你将会通过接口来使用它，当控制器在 Web 服务器上运行的时候，控制器将会接受任何实现仓储接口的对象引用。通过接收仓储对象进行数据的存储管理，使得你可以容易地控制测试，就像使用内存中的集合一样。&lt;br /&gt;在教程的最后，你将要在 Course 控制器中对 Course 和 Department 实体使用多个仓储和一个工作单元类。工作单元类则通过创建一个所有仓储共享的数据库上下文对象，来组织多个仓储对象。如果你希望执行自动化的单元测试，你也应该对 Student类通过相同的方式创建和使用接口。不管怎样，为了保持教程的简单，你将不会通过接口创建和使用这些类。&lt;br /&gt;下面的截图展示了在控制器和上下文之间的概念图，用来比较与不使用仓储或工作单元模式的区别。&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578149/Windows-Live-Writer_8c4963ba1fa3_CE3B_Repository_pattern_diagram_1df790d3-bdf2-4c11-9098-946ddd9cd884.png" alt="" width="635" height="615" /&gt;&lt;/p&gt;&lt;p&gt;在这个教程中不会创建单元测试，在 MVC 应用中使用仓储模式进行 TDD 的相关信息，可以查看 MSDN 网站中的 Walkthrough: Using TDD with ASP.NET MVC ，EF 团队博客中的 Using Repository and Unit of Work patterns with Entity Framework 4.0 ，以及 Julie Lerman 的博客 Agile Entity Framework 4 Repository&amp;nbsp; 系列。&lt;br /&gt;注意：有多种方式可以实现仓储和工作单元模式。配合工作单元类可以使用也可以不使用仓储类。可以对所有的实体类型实现一个简单的仓储，或者每种类型一个。如果为每种类型实现一个仓储，还可以通过分离的类，或者泛型的基类然后派生，或者抽象基类然后派生。可以将业务逻辑包含在仓储中，或者限制只有数据访问逻辑。也可以通过在实体中使用 IDbSet 接口代替 DbSet 类为数据库上下文类创建一个抽象层。在这个教程中展示的目标实现了抽象层，只是其中一种考虑，并不是针对所有的场景和环境都适用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-2&amp;nbsp; 创建 Student 仓储类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 DAL 文件夹中，创建一个文件名为 IStudentRepository.cs 的文件，将当前的代码使用如下代码替换。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IStudentRepository : IDisposable&lt;br/&gt;    {&lt;br/&gt;        IEnumerable&lt;/span&gt;&amp;lt;Student&amp;gt;&lt;span style="color: #000000;"&gt; GetStudents();&lt;br/&gt;        Student GetStudentByID(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; studentId);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; InsertStudent(Student student);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; DeleteStudent(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; studentID);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; UpdateStudent(Student student);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Save();&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码定义了一套典型的增、删、改、查方法。包括两个读取方法 &amp;ndash; 一个返回所有的学生实体，一个通过 ID 查询单个实体。&lt;br /&gt;在 DAL 文件夹中，创建名为 StudentRepository.cs 的类文件，使用下面的代码替换原有的代码，这个类实现了 IStudentRepository 接口。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentRepository : IStudentRepository, IDisposable&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext context;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentRepository(SchoolContext context)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context =&lt;span style="color: #000000;"&gt; context;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Student&amp;gt;&lt;span style="color: #000000;"&gt; GetStudents()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; context.Students.ToList();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Student GetStudentByID(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; context.Students.Find(id);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; InsertStudent(Student student)&lt;br/&gt;        {&lt;br/&gt;            context.Students.Add(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; DeleteStudent(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; studentID)&lt;br/&gt;        {&lt;br/&gt;            Student student &lt;/span&gt;=&lt;span style="color: #000000;"&gt; context.Students.Find(studentID);&lt;br/&gt;            context.Students.Remove(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; UpdateStudent(Student student)&lt;br/&gt;        {&lt;br/&gt;            context.Entry(student).State &lt;/span&gt;=&lt;span style="color: #000000;"&gt; EntityState.Modified;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Save()&lt;br/&gt;        {&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; disposed = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; disposing)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.disposed)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (disposing)&lt;br/&gt;                {&lt;br/&gt;                    context.Dispose();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.disposed = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dispose()&lt;br/&gt;        {&lt;br/&gt;            Dispose(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            GC.SuppressFinalize(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;数据库上下文是类中定义的一个成员变量，构造函数期望传递一个数据库上下文对象实例。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext context;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentRepository(SchoolContext context)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context =&lt;span style="color: #000000;"&gt; context;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;你需要创建一个新的数据库上下文实例，但是如果在控制器中需要使用多个仓储类，每一个会得到一个不同的数据库上下文对象。后面在 Course 控制器中，你将要使用多个仓储，会看到如何使用工作单元类来保证所有的仓储使用相同的数据库上下文对象。&lt;br /&gt;仓储类还实现了 IDisposable 接口，如同在前面控制器中所见，释放数据库上下文，仓储的增删改查方法也如前所见调用数据库上下文的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-3&amp;nbsp; 修改 Student 控制器使用仓储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 StudentController.cs 中，使用下面的代码替换现有的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.Entity;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Mvc;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; PagedList;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Controllers&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentController : Controller&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; IStudentRepository studentRepository;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentController()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.studentRepository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StudentRepository(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext());&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentController(IStudentRepository studentRepository)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.studentRepository =&lt;span style="color: #000000;"&gt; studentRepository;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Student/&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Index(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sortOrder, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; currentFilter, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; searchString, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;?&lt;span style="color: #000000;"&gt; page)&lt;br/&gt;        {&lt;br/&gt;            ViewBag.CurrentSort &lt;/span&gt;=&lt;span style="color: #000000;"&gt; sortOrder;&lt;br/&gt;            ViewBag.NameSortParm &lt;/span&gt;= String.IsNullOrEmpty(sortOrder) ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            ViewBag.DateSortParm &lt;/span&gt;= sortOrder == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Request.HttpMethod == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                searchString &lt;/span&gt;=&lt;span style="color: #000000;"&gt; currentFilter;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                page &lt;/span&gt;= &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            ViewBag.CurrentFilter &lt;/span&gt;=&lt;span style="color: #000000;"&gt; searchString;&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; studentRepository.GetStudents()&lt;br/&gt;                           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; s;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;String.IsNullOrEmpty(searchString))&lt;br/&gt;            {&lt;br/&gt;                students &lt;/span&gt;= students.Where(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.LastName.ToUpper().Contains(searchString.ToUpper())&lt;br/&gt;                                       &lt;/span&gt;||&lt;span style="color: #000000;"&gt; s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (sortOrder)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    students &lt;/span&gt;= students.OrderByDescending(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.LastName);&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    students &lt;/span&gt;= students.OrderBy(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.EnrollmentDate);&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    students &lt;/span&gt;= students.OrderByDescending(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.EnrollmentDate);&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    students &lt;/span&gt;= students.OrderBy(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.LastName);&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageSize = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageNumber = (page ?? &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(students.ToPagedList(pageNumber, pageSize));&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Student/Details/5&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Details(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            Student student &lt;/span&gt;=&lt;span style="color: #000000;"&gt; studentRepository.GetStudentByID(id);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Student/Create&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; POST: /Student/Create&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        [HttpPost]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create(Student student)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;                {&lt;br/&gt;                    studentRepository.InsertStudent(student);&lt;br/&gt;                    studentRepository.Save();&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;                ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Student/Edit/5&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            Student student &lt;/span&gt;=&lt;span style="color: #000000;"&gt; studentRepository.GetStudentByID(id);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; POST: /Student/Edit/5&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        [HttpPost]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Edit(Student student)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;                {&lt;br/&gt;                    studentRepository.UpdateStudent(student);&lt;br/&gt;                    studentRepository.Save();&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;                ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Student/Delete/5&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Delete(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id, &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;?&lt;span style="color: #000000;"&gt; saveChangesError)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (saveChangesError.GetValueOrDefault())&lt;br/&gt;            {&lt;br/&gt;                ViewBag.ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            Student student &lt;/span&gt;=&lt;span style="color: #000000;"&gt; studentRepository.GetStudentByID(id);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(student);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; POST: /Student/Delete/5&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        [HttpPost, ActionName(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult DeleteConfirmed(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                Student student &lt;/span&gt;=&lt;span style="color: #000000;"&gt; studentRepository.GetStudentByID(id);&lt;br/&gt;                studentRepository.DeleteStudent(id);&lt;br/&gt;                studentRepository.Save();&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Routing.RouteValueDictionary { &lt;br/&gt;                { &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, id }, &lt;br/&gt;                { &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;saveChangesError&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; } });&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; disposing)&lt;br/&gt;        {&lt;br/&gt;            studentRepository.Dispose();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Dispose(disposing);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在控制器中定义了一个 IStudentRepository 接口的类变量，而不是直接的数据库上下文。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; IStudentRepository studentRepository;&lt;/div&gt;&lt;p&gt;默认的构造函数创建一个新的上下文接口，可选的构造函数允许调用者传递一个数据库上下文实例。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentController()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.studentRepository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StudentRepository(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext());&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentController(IStudentRepository studentRepository)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.studentRepository =&lt;span style="color: #000000;"&gt; studentRepository;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;( 如果使用依赖注入，或者 DI，就不需要默认构造函数，因为 DI 容器会为你创建正确的仓储对象 )&lt;br /&gt;在 CRUD 方法中，调用仓储方法来而不是数据库上下文的方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; studentRepository.GetStudents()&lt;br/&gt;               &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; s;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Student student = studentRepository.GetStudentByID(id);&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;studentRepository.InsertStudent(student);&lt;br/&gt;studentRepository.Save();&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;studentRepository.UpdateStudent(student);&lt;br/&gt;studentRepository.Save();&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;studentRepository.DeleteStudent(id);&lt;br/&gt;studentRepository.Save();&lt;/span&gt;&lt;/div&gt;&lt;p&gt;现在的 Dispose 方法释放仓储而不是数据库上下文。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;studentRepository.Dispose();&lt;/div&gt;&lt;p&gt;运行程序，点击 Students 窗格。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578155/Windows-Live-Writer_8c4963ba1fa3_CE3B_Students_Index_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;现在的页面显示与使用仓储之前完全相同。其他的学生页面也一样。实际上，在 Index 控制器方法的过滤和排序中，存在一个重要的不同，原来版本的代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; context.Students&lt;br/&gt;               &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; s;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;String.IsNullOrEmpty(searchString))&lt;br/&gt;{&lt;br/&gt;    students &lt;/span&gt;= students.Where(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.LastName.ToUpper().Contains(searchString.ToUpper())&lt;br/&gt;                           &lt;/span&gt;||&lt;span style="color: #000000;"&gt; s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在原来版本的代码中，students 变量的类型是 IQueryable ，查询在使用诸如 ToList 方法转换为集合之前并不会发送到数据库中。这意味着这里的 Where 方法在处理到数据库中的时候变成 SQL 中的 where 子句。同时意味着仅仅选中的实体从数据库中返回。从 context.Students 修改为 studentRepository.GetStudents() 之后，代码中的 students 变量类型成为 IEnumerable 集合，包括数据库中所有的学生。通过 Where 方法得到的结果是一样的，但是处理在 Web 服务器的内存中进行，而不是在数据库中。对于大量的数据来说，这样做是低效的。后继的段落展示如何通过仓储方法实现在数据库中完成。&lt;br /&gt;现在你已经在控制器和 EF 数据库上下文之间创建了抽象层。如果你将在这个程序中执行自动化的单元测试，可以在单元测试项目中创建一个替代的实现接口 IStudentRepository 仓储类，来代替实际的上下文完成读写数据。这个模拟 ( Mock ) 的仓储类可以通过操作内存中的集合来测试控制器功能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-4&amp;nbsp; 实现泛型的仓储和工作单元&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对每一个实体类型创建一个仓储将会导致大量重复代码。还会带来部分更新的问题。例如，假设在一个事务中更新两个不同的实体。 如果每一个仓储使用不同的数据库上下文实例，一个可能成功了，另外一个失败了。一种减少冗余代码的方式是使用泛型仓储，另一种方式是使用工作单元类来确保所有的仓储都使用同样的数据库上下文 ( 来协调所有的更新 )。&lt;br /&gt;在这一节中，你将要创建 GenericRepository 类和 UnitOfWork 类。在 Course 控制器中使用它们来访问 Department 和 Course 实体集。如前所述，为了保持教程的简单，不为这些类创建接口，但是为了以后使用它们进行 TDD 的便利，你应该像在 Student 仓储中一样通过接口实现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-4-1&amp;nbsp; 创建泛型仓储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 DAL 文件夹中，创建 GenericRepository.cs ，使用下面的代码替换原有代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.Entity;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq.Expressions;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; GenericRepository&amp;lt;TEntity&amp;gt; &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; TEntity : &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext context;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; DbSet&amp;lt;TEntity&amp;gt;&lt;span style="color: #000000;"&gt; dbSet;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenericRepository(SchoolContext context)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context =&lt;span style="color: #000000;"&gt; context;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dbSet = context.Set&amp;lt;TEntity&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; IEnumerable&amp;lt;TEntity&amp;gt;&lt;span style="color: #000000;"&gt; Get(&lt;br/&gt;            Expression&lt;/span&gt;&amp;lt;Func&amp;lt;TEntity, &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; filter = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;            Func&lt;/span&gt;&amp;lt;IQueryable&amp;lt;TEntity&amp;gt;, IOrderedQueryable&amp;lt;TEntity&amp;gt;&amp;gt; orderBy = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; includeProperties = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            IQueryable&lt;/span&gt;&amp;lt;TEntity&amp;gt; query =&lt;span style="color: #000000;"&gt; dbSet;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (filter != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                query &lt;/span&gt;=&lt;span style="color: #000000;"&gt; query.Where(filter);&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; includeProperty &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; includeProperties.Split&lt;br/&gt;                (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; }, StringSplitOptions.RemoveEmptyEntries))&lt;br/&gt;            {&lt;br/&gt;                query &lt;/span&gt;=&lt;span style="color: #000000;"&gt; query.Include(includeProperty);&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (orderBy != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; orderBy(query).ToList();&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; query.ToList();&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; TEntity GetByID(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; dbSet.Find(id);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Insert(TEntity entity)&lt;br/&gt;        {&lt;br/&gt;            dbSet.Add(entity);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Delete(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            TEntity entityToDelete &lt;/span&gt;=&lt;span style="color: #000000;"&gt; dbSet.Find(id);&lt;br/&gt;            Delete(entityToDelete);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Delete(TEntity entityToDelete)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (context.Entry(entityToDelete).State ==&lt;span style="color: #000000;"&gt; EntityState.Detached)&lt;br/&gt;            {&lt;br/&gt;                dbSet.Attach(entityToDelete);&lt;br/&gt;            }&lt;br/&gt;            dbSet.Remove(entityToDelete);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Update(TEntity entityToUpdate)&lt;br/&gt;        {&lt;br/&gt;            dbSet.Attach(entityToUpdate);&lt;br/&gt;            context.Entry(entityToUpdate).State &lt;/span&gt;=&lt;span style="color: #000000;"&gt; EntityState.Modified;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;为数据库上下文创建变量，以及仓储代表的实体集。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext context;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; DbSet dbSet;&lt;/div&gt;&lt;p&gt;构造函数接受一个数据库上下文实例，然后初始化实体集变量。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenericRepository(SchoolContext context)&lt;br/&gt;{&lt;br/&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context =&lt;span style="color: #000000;"&gt; context;&lt;br/&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dbSet =&lt;span style="color: #000000;"&gt; context.Set();&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Get 方法接受 Lambda 表达式，允许调用代码通过 Lambda 表达式来传递过滤条件和排序列，字符串参数允许调用者传递一个逗号分隔的导航属性进行预先加载。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; IEnumerable&amp;lt;TEntity&amp;gt;&lt;span style="color: #000000;"&gt; Get(&lt;br/&gt;    Expression&lt;/span&gt;&amp;lt;Func&amp;lt;TEntity, &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; filter = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    Func&lt;/span&gt;&amp;lt;IQueryable&amp;lt;TEntity&amp;gt;, IOrderedQueryable&amp;lt;TEntity&amp;gt;&amp;gt; orderBy = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; includeProperties = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;)&lt;/div&gt;&lt;p&gt;代码 Expression&amp;lt;Func&amp;lt;TEntity, bool&amp;gt;&amp;gt; filter&amp;nbsp; 表示调用方需要提供一个基于 TEntity 类型的 Lambda 表达式，表达式将会返回 bool 类型的值。例如，如果仓储实例化为 Student 类型，调用的方法可能为 filter 传递的参数为&amp;nbsp; student =&amp;gt; student.LastName == "Smith"&lt;br /&gt;代码 Func&amp;lt;IQueryable&amp;lt;TEntity&amp;gt;, IOrderedQueryable&amp;lt;TEntity&amp;gt;&amp;gt; orderBy&amp;nbsp; 也表示调用方需要提供一个 Lambda 表达式，在这里，表达式是 TEntity 类型的 IQueryable 对象。返回排序版本的 IQueryable 对象。例如，如果仓储实例化为 Student 实体类型，代码为 orderBy 参数传递的参数可能为 q =&amp;gt; q.OrderBy(s =&amp;gt; s.LastName)&amp;nbsp; 。&lt;br /&gt;Get 方法创建一个 IQueryable 对象，如果存在过滤条件的话，再使用过滤条件。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;IQueryable&amp;lt;TEntity&amp;gt; query =&lt;span style="color: #000000;"&gt; dbSet;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (filter != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    query &lt;/span&gt;=&lt;span style="color: #000000;"&gt; query.Where(filter);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;然后，在解析逗号分隔的列表之后，应用预先加载。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; includeProperty &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; includeProperties.Split&lt;br/&gt;    (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; }, StringSplitOptions.RemoveEmptyEntries)) &lt;br/&gt;{ &lt;br/&gt;    query &lt;/span&gt;=&lt;span style="color: #000000;"&gt; query.Include(includeProperty); &lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;最后，如果存在排序条件，应用 orderBy 表达式，否则它返回没有排序的查询。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (orderBy != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; orderBy(query).ToList();&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; query.ToList();&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在调用 Get 方法的时候，你可以不提供这些参数，而通过方法返回的 IEnumerable 集合进行过滤和排序，但是排序和过滤将会在 Web 服务器的内存中进行。通过使用这些参数，可以使这些工作在数据库中进行而不是在 Web 服务器上进行。另外一种替代方式是为特定的实体类型创建派生类，增加特定的 Get 方法，诸如 GetStudentsInNameOrder 或者 GetStudentsByName。然而，在复杂的应用中，这会导致大量的派生类和特定方法，在维护的时候会导致大量的工作。&lt;br /&gt;在 GetByID， Insert 和 Update 中的方法如同在非泛型方法中一样简单 ( 在 GetByID 方法扎没有提供预先加载参数，因为不能对 Find 方法进行预先加载 )。&lt;br /&gt;Delete 方法有两个重载。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Delete(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    TEntity entityToDelete &lt;/span&gt;=&lt;span style="color: #000000;"&gt; dbSet.Find(id);&lt;br/&gt;    dbSet.Remove(entityToDelete);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Delete(TEntity entityToDelete)&lt;br/&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (context.Entry(entityToDelete).State ==&lt;span style="color: #000000;"&gt; EntityState.Detached)&lt;br/&gt;            {&lt;br/&gt;                dbSet.Attach(entityToDelete);&lt;br/&gt;            }&lt;br/&gt;            dbSet.Remove(entityToDelete);&lt;br/&gt;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;一个允许仅仅传递实体的 ID 进行删除，另外一个使用实体实例。像在处理并发中所见，对于并发处理你需要 Delete 方法获取包含追踪属性原始值的实体实例。&lt;br /&gt;泛型仓储可以处理典型的 CRUD 需求。当特定的实体有特定的需求时，例如更加复杂的过滤或者排序，可以通过创建派生类来增加额外的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-4-2&amp;nbsp; 创建工作单元类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;工作单元类服务于一个目的：当你使用多个仓储的时候，共享单个的数据库上下文实例。因此，当工作单元完成的时候，你可以通过在这个数据库上下文实例上调用 SaveChanges 方法来保证相关的所有操作被协调处理。所有这个类需要的就是一个 Save 方法和每个仓储一个的属性。每个仓储属性返回使用相同的数据库上下文对象创建的仓储对象实例。&lt;br /&gt;在 DAL 文件夹中，创建名为 UnitOfWork.cs 的文件，使用下面的代码替换原有内容。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnitOfWork : IDisposable&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; SchoolContext context = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; GenericRepository&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt; departmentRepository;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; GenericRepository&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt; courseRepository;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; GenericRepository&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt; DepartmentRepository&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.departmentRepository == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.departmentRepository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GenericRepository&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt;(context);&lt;br/&gt;                }&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; departmentRepository;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; GenericRepository&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt; CourseRepository&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.courseRepository == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.courseRepository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GenericRepository&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;(context);&lt;br/&gt;                }&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; courseRepository;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Save()&lt;br/&gt;        {&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; disposed = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; disposing)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.disposed)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (disposing)&lt;br/&gt;                {&lt;br/&gt;                    context.Dispose();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.disposed = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dispose()&lt;br/&gt;        {&lt;br/&gt;            Dispose(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            GC.SuppressFinalize(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码为数据库上下文以及每个仓储创建类级成员变量。对于 context 变量，新的上下文对象被实例化。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; SchoolContext context = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; GenericRepository&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt; departmentRepository;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; GenericRepository&amp;lt;Course&amp;gt; courseRepository;&lt;/div&gt;&lt;p&gt;每个仓储属性检查仓储是否已经被创建了，如果没有，就传递数据库上下文对象，初始化仓储对象，因此，所有的仓储共享相同的数据库上下文。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; GenericRepository&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt; DepartmentRepository&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.departmentRepository == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.departmentRepository = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GenericRepository&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt;(context);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; departmentRepository;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;像在类中实例化数据库上下文的其他类一样， UnitOfWork 类也实现了 IDisposable 接口来释放数据库上下文。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9-4-3&amp;nbsp; 修改 CourseController 使用工作单元类和仓储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用如下代码替换当前的 CourseController.cs。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.Entity;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Mvc;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Controllers&lt;br/&gt;{ &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CourseController : Controller&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; UnitOfWork unitOfWork = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnitOfWork();&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Course/&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ViewResult Index()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; courses = unitOfWork.CourseRepository.Get(includeProperties: &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Department&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(courses.ToList());&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Course/Details/5&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Details(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            Course course &lt;/span&gt;=&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Course/Create&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create()&lt;br/&gt;        {&lt;br/&gt;            PopulateDepartmentsDropDownList();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        [HttpPost]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create(Course course)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;                {&lt;br/&gt;                    unitOfWork.CourseRepository.Insert(course);&lt;br/&gt;                    unitOfWork.Save();&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;                ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;            PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            Course course &lt;/span&gt;=&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;            PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        [HttpPost]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Edit(Course course)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;                {&lt;br/&gt;                    unitOfWork.CourseRepository.Update(course);&lt;br/&gt;                    unitOfWork.Save();&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;                ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;            PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; PopulateDepartmentsDropDownList(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; selectedDepartment = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; departmentsQuery =&lt;span style="color: #000000;"&gt; unitOfWork.DepartmentRepository.Get(&lt;br/&gt;                orderBy: q &lt;/span&gt;=&amp;gt; q.OrderBy(d =&amp;gt;&lt;span style="color: #000000;"&gt; d.Name));&lt;br/&gt;            ViewBag.DepartmentID &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SelectList(departmentsQuery, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DepartmentID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, selectedDepartment);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Course/Delete/5&lt;/span&gt;&lt;br/&gt; &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Delete(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            Course course &lt;/span&gt;=&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; POST: /Course/Delete/5&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        [HttpPost, ActionName(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult DeleteConfirmed(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            Course course &lt;/span&gt;=&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;            unitOfWork.CourseRepository.Delete(id);&lt;br/&gt;            unitOfWork.Save();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; disposing)&lt;br/&gt;        {&lt;br/&gt;            unitOfWork.Dispose();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Dispose(disposing);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码中增加了 UnitOfWork 类级成员变量。( 如果在这里使用接口，就不需要在这里实例化对象，相反，应该实现类似前面 Student 仓储的两个构造函数 )&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; UnitOfWork unitOfWork = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; UnitOfWork();&lt;/div&gt;&lt;p&gt;在类中的其他部分，所有引用的数据库上下文替换为适当的仓储。使用 UnitOfWork 属性来访问仓储。Dispose 方法用来释放 UnitOfWork 实例。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; courses = unitOfWork.CourseRepository.Get(includeProperties: &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Department&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;Course course =&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;unitOfWork.CourseRepository.Insert(course);&lt;br/&gt;unitOfWork.Save();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;Course course =&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;unitOfWork.CourseRepository.Update(course);&lt;br/&gt;unitOfWork.Save();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; departmentsQuery =&lt;span style="color: #000000;"&gt; unitOfWork.DepartmentRepository.Get(&lt;br/&gt;    orderBy: q &lt;/span&gt;=&amp;gt; q.OrderBy(d =&amp;gt;&lt;span style="color: #000000;"&gt; d.Name));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;Course course =&lt;span style="color: #000000;"&gt; unitOfWork.CourseRepository.GetByID(id);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;unitOfWork.CourseRepository.Delete(id);&lt;br/&gt;unitOfWork.Save();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ...&lt;/span&gt;&lt;br/&gt;unitOfWork.Dispose();&lt;/div&gt;&lt;p&gt;运行程序，点击 Courses 窗格。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578161/Windows-Live-Writer_8c4963ba1fa3_CE3B_Courses_Index_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;页面工作如同既往修改之前一样，Course 页面也同样工作。&lt;br /&gt;你现在已经实现了仓储和工作单元模式。在泛型仓储中使用 Lambda 表达式作为参数。更多对 IQueryable 对象使用表达式的信息，可以参阅 MSDN 库中的 IQueryable(T) Interface (System.Linq) 。下一次，将学习如何处理一些高级场景。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2476595.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/05/01/2476595.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/28/2475284.html</id><title type="text">翻译：Contoso 大学 - 8 – 实现继承</title><summary type="text">在上一次教程中，你已经能够处理并发异常。这个教程将会展示如何在数据模型中实现继承。在面向对象的程序设计中，你可以通过继承来清除冗余的代码。在这个教程中，你将要通过修改教师 Instructor 和学生 Student 类，以便使他们从包含类似 LastName 属性的 Person 类中派生。对于 Web 页面不需要任何改动，你需要修改一点代码，这些修改将会被自动反射到数据库中。</summary><published>2012-04-28T07:56:00Z</published><updated>2012-04-28T07:56:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/28/2475284.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/28/2475284.html"/><content type="html">&lt;p&gt;By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform &amp;amp; Tools Content Team.&lt;br /&gt;&lt;br /&gt;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application&lt;/a&gt;&lt;br title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application" /&gt;全文目录：&lt;a title="Contoso 大学 - 使用 EF Code First 创建 MVC 应用" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html" target="_blank"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在上一次教程中，你已经能够处理并发异常。这个教程将会展示如何在数据模型中实现继承。&lt;br /&gt;在面向对象的程序设计中，你可以通过继承来清除冗余的代码。在这个教程中，你将要通过修改教师 Instructor 和学生 Student 类，以便使他们从包含类似 LastName 属性的 Person 类中派生。对于 Web 页面不需要任何改动，你需要修改一点代码，这些修改将会被自动反射到数据库中。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8-1&amp;nbsp; 单表继承 (Table-per-Hierarchy) 对类型表 (Table-per-Type) 继承&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;在面向对象的程序设计中，你可以通过对相关的类使用继承来使得工作更加简单。例如，教师 Instructor 和学生 Student 类在学校 School 数据模型中共享多个属性，带来了冗余的代码。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578113/Windows-Live-Writer_58f5a93579b2_CC7B_Student_and_Instructor_classes_e7a32f99-8bc4-48ce-aeaf-216a18071a8b.png" alt="" width="560" height="230" /&gt;&lt;/p&gt;&lt;p&gt;假设你希望清除在教师 Instructor 和学生 Student 之间所共享的属性带来的冗余代码。可以创建一个 Person 基类，其中仅仅包含他们共享的属性，然后，使得教师 Instructor 和学生 Student 类从 Person 基类派生，如下图所示。&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578119/Windows-Live-Writer_58f5a93579b2_CC7B_Student_and_Instructor_classes_deriving_from_Person_class_671d708c-cbb8-454a-a8f8-c2d99439acd9.png" alt="" width="568" height="423" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在数据库中这种继承结构可以有多种表现形式，可以创建一个名为 Person 的表，在这个独立的表中包含教师和学生所有的信息。既包括他们独自拥有的属性 ( 例如教师的 HireDate ，以及学生的 EnrollmentDate )，也包括它们共有的属性 ( 例如 LastName, FirstName )。通常你还需要一个用于识别当前类型的列 discriminator 来标识当前行的类型。( 在这里，标识列的内容为 Instructor 来表示教师，Student 来表示学生 )&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578125/Windows-Live-Writer_58f5a93579b2_CC7B_Table-per-hierarchy_example_244067cd-b451-4e9b-9595-793b9afca505.png" alt="" width="355" height="181" /&gt;&lt;/p&gt;&lt;p&gt;使用单个数据库表来生成实体继承结构的模式称为单表继承模式 TPH (table-per-hierarchy )。&lt;br /&gt;另外一种方式是使得数据库看起来类似继承结构。例如，在 Person 表中仅仅包含他们共有的名字属性，而将不同的时间分别保存到独立的 Instructor 和 Student 表中。&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578131/Windows-Live-Writer_58f5a93579b2_CC7B_Table-per-type_inheritance.png" alt="" width="393" height="303" /&gt;&lt;/p&gt;&lt;p&gt;这种每种实体类对应一张数据库表的模式称为类型表 TPT&amp;nbsp; 继承 (table per type )。&lt;br /&gt;在 EF 中，TPH 继承比 TPT 继承有更好的性能，因为 TPT 继承需要复杂的连接查询。这个教程演示如何实现 TPH 继承。你需要完成如下的步骤：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;创建 Person 类，将 Instructor 和 Student 类从 Person 类中派生&lt;/li&gt;&lt;li&gt;在数据库上下文类中增加模型到数据库的映射代码&lt;/li&gt;&lt;li&gt;将项目中的 InstructorID 和 StudentID 修改为使用 PersonID.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;8-2&amp;nbsp; 创建 Person 类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 Model 文件夹中，创建 Person.cs ，使用下面的代码替换原有的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Person&lt;br/&gt;    {&lt;br/&gt;        [Key]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PersonID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Column(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstMidName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; FullName &lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; LastName + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; FirstMidName;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 Instructor.cs 文件中，将 Instructor 从 Person 派生出来，删除 key 和 name 字段。代码如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Instructor : Person&lt;br/&gt;    {&lt;br/&gt;        [DisplayFormat(DataFormatString &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hire date is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hire Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime? HireDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Course&amp;gt; Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;      &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; OfficeAssignment OfficeAssignment { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;对 Student.cs 文件进行类似的修改，修改后的 Student 类如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Student : Person&lt;br/&gt;    {&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enrollment date is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [DisplayFormat(DataFormatString &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enrollment Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime? EnrollmentDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8-3&amp;nbsp; 在模型中增加 Person 实体类型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;在 SchoolContext.cs 文件中，对 Person 实体类型增加一个 DbSet 类型的属性。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Person&amp;gt; People { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;这就是在 EF 中配置 TPH 继承所有需要完成的工作。如你所见，当数据库重建的时候，EF 会自动创建 Person 表。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8-4&amp;nbsp; 修改 InstructorID 和 StudentID 为 PersonID&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;在 SchoolContext.cs 文件中，在教师对课程的映射语句中，将 MapRightKey(&amp;ldquo;InstructorID&amp;rdquo;) 修改为 MapRightKey(&amp;ldquo;PersonID&amp;rdquo;)。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;modelBuilder.Entity&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;    .HasMany(c &lt;/span&gt;=&amp;gt; c.Instructors).WithMany(i =&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;    .Map(t &lt;/span&gt;=&amp;gt; t.MapLeftKey(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CourseID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    .MapRightKey(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PersonID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    .ToTable(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CourseInstructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;/div&gt;&lt;p&gt;这个修改不是必须的，它仅仅修改了在表多对多连接中 InstructorID 的名字。如果你保留名为仍然为 InstructorID，程序还是可以正常工作的。&lt;br /&gt;下一步，进行一次全局的替换 ( 项目中所有的文件 )，将 InstructorID 修改为 PersonID，StudentID 修改为 PersonID。注意区分大小写。( 这里演示了使用类名加上 ID 作为主键的一个缺点。如果你没有使用类名加上 ID 作为主键，这里就不需要重新命名 )&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8-5&amp;nbsp; 在初始化器中修改主键的值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 SchoolInitializer.cs 中，代码假设对于 Student 和 Instructor 实体的主键数字是分离的。这对于 Student 实体来说仍然正确 ( 他们仍然从 1 到 8 )，但是对于 Instructor 实体来说，将不再从 1-5 而是修改为 9-13，因为在初始化类中的代码将教师增加在同一张表的学生之后。使用下面的代码修改 Department 和 OfficeAssignment 实体中的代码，以便使用新的教师 ID。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; departments = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;English&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     Budget = &lt;span style="color: #800080;"&gt;350000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), PersonID = &lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Mathematics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Budget = &lt;span style="color: #800080;"&gt;100000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), PersonID = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Engineering&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Budget = &lt;span style="color: #800080;"&gt;350000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), PersonID = &lt;span style="color: #800080;"&gt;11&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Economics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   Budget = &lt;span style="color: #800080;"&gt;100000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), PersonID = &lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt; }&lt;br/&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; officeAssignments = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;OfficeAssignment&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OfficeAssignment { PersonID = &lt;span style="color: #800080;"&gt;9&lt;/span&gt;, Location = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Smith 17&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OfficeAssignment { PersonID = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;, Location = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Gowan 27&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OfficeAssignment { PersonID = &lt;span style="color: #800080;"&gt;11&lt;/span&gt;, Location = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Thompson 304&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;};&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8-6&amp;nbsp; 将 OfficeAssignment 调整为延迟加载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当前版本的 EF 对导航属性使用了 TPH继承模式后的派生类，在一对一，或者一对零的关系上不支持预先加载模式。这对于 Instructor 实体上的 OfficeAssignment 属性是个问题。解决这个问题，需要删除在这个属性上使用的预先加载处理。&lt;br /&gt;在 InstructorController.cs 文件中，删除三次出现的如下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; .Include(i =&amp;gt; i.OfficeAssignment)&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8-7&amp;nbsp; 测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;运行程序，在各个页面上检查一下，所有的工作如以前一样。&lt;br /&gt;在解决方案管理器上，双击 School.sdf 数据库，在服务器资源管理器中打开，展开 School.sdf，然后选择 Tables，你会看到 Student 和 Instructor 表已经被 Person 表替换掉了。展开 Person 表，你会看到其中拥有原来 Student 和 Instructor 中所有的列，加上 discriminator 列。&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578137/Windows-Live-Writer_58f5a93579b2_CC7B_Server_Explorer_showing_Person_table.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;下图展示了新的 School 数据库的结构。&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578143/Windows-Live-Writer_58f5a93579b2_CC7B_School_database_diagram_6350a801-7199-413f-bbac-4a2009ed19d7.png" alt="" width="523" height="603" /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;对于 Person ，Student 和 Instructor 类，通过 TPH 实现了继承。对于更多的关于其他继承结构，可以查看 Morteza Manavi 的博客 Inheritance Mapping Strategies。在下一次的教程中，将会学习实现仓储和单元模式的一些途径。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2475284.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/28/2475284.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/22/2465613.html</id><title type="text">翻译：Contoso 大学 - 7 – 处理并发</title><summary type="text">在上一次的教程中我们处理了关联数据问题。这个教程演示如何处理并发问题。你将使用 Department 实体创建一个页面，这个页面在支持编辑和删除的同时，还可以处理并发错误。下面的截图演示了 Index 页面和 Delete 页面，包括在出现并发冲突的时候提示的一些信息。</summary><published>2012-04-22T14:56:00Z</published><updated>2012-04-22T14:56:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/22/2465613.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/22/2465613.html"/><content type="html">【摘要】在上一次的教程中我们处理了关联数据问题。这个教程演示如何处理并发问题。你将使用 Department 实体创建一个页面，这个页面在支持编辑和删除的同时，还可以处理并发错误。下面的截图演示了 Index 页面和 Delete 页面，包括在出现并发冲突的时候提示的一些信息。 &lt;a href="在上一次的教程中我们处理了关联数据问题。这个教程演示如何处理并发问题。你将使用 Department 实体创建一个页面，这个页面在支持编辑和删除的同时，还可以处理并发错误。下面的截图演示了 Index 页面和 Delete 页面，包括在出现并发冲突的时候提示的一些信息。" target="_blank"&gt;http://www.cnblogs.com/haogj/archive/2012/04/22/2465613.html&lt;/a&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2465613.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/22/2465613.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/18/2456181.html</id><title type="text">翻译：Contoso 大学 - 6 – 更新关联数据</title><summary type="text">在上一次的课程中，你已经学习了如何显示关联的数据，我们将要更新关联的数据。大多数情况下，可能就是更新表的外键字段。对于多对多的关系来说，由于 EF 并没有直接将表与表之间的连接关系暴露出来，你就必须通过显式对相关的导航属性进行添加或者删除实体来完成。</summary><published>2012-04-18T15:34:00Z</published><updated>2012-04-18T15:34:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/18/2456181.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/18/2456181.html"/><content type="html">&lt;p&gt;&lt;strong&gt;By&amp;nbsp;Tom Dykstra&lt;/strong&gt;, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform &amp;amp; Tools Content Team.&lt;/p&gt;&lt;p&gt;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application" target="_blank"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;全文目录：&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在上一次的课程中，你已经学习了如何显示关联的数据，我们将要更新关联的数据。大多数情况下，可能就是更新表的外键字段。对于多对多的关系来说，由于 EF 并没有直接将表与表之间的连接关系暴露出来，你就必须通过显式对相关的导航属性进行添加或者删除实体来完成。&lt;/p&gt;&lt;p&gt;下面的截图展示了我们马上要完成的工作。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577933/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Course_create_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577939/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Course_edit_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577945/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Instructor_edit_page_with_courses.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6-1&amp;nbsp; 定制课程的创建和编辑页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当新的课程实体创建的时候，必须包含相关的 Department。为了达到这个目的，脚手架创建的代码，包括创建和编辑的控制器以及视图，都包含了对 Department 的下拉列表的支持。下拉列表设置 Course.DepartmentId 外键属性，这对于 EF 通过 Department 导航属性来加载 Department 实体来说是必须的。下面将要对脚手架生成的代码进行一些小的改动，增加错误的处理以及对列表内容进行排序。&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;CourseController.cs&lt;/em&gt;, 删除原来的 Edit 和 Create 方法，使用下面的代码替换它们。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create()&lt;br/&gt;{&lt;br/&gt;    PopulateDepartmentsDropDownList();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[HttpPost]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create(Course course)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;        {&lt;br/&gt;            db.Courses.Add(course);&lt;br/&gt;            db.SaveChanges();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;        ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;    PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    Course course &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Courses.Find(id);&lt;br/&gt;    PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[HttpPost]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Edit(Course course)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ModelState.IsValid)&lt;br/&gt;        {&lt;br/&gt;            db.Entry(course).State &lt;/span&gt;=&lt;span style="color: #000000;"&gt; EntityState.Modified;&lt;br/&gt;            db.SaveChanges();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;        ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;    PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; PopulateDepartmentsDropDownList(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; selectedDepartment = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; departmentsQuery = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; d &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; db.Departments&lt;br/&gt;                           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;orderby&lt;/span&gt;&lt;span style="color: #000000;"&gt; d.Name&lt;br/&gt;                           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; d;&lt;br/&gt;    ViewBag.DepartmentID &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SelectList(departmentsQuery, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DepartmentID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, selectedDepartment);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;PopulateDepartmentsDropDownList 方法获取经过对 Name 进行排序的 Department，然后创建用于下拉列表的 SelectList 集合，通过 ViewBag 传递到视图中。这个方法包含一个参数，允许调用方可选地传递一个初始选中项目的值。&lt;/p&gt;&lt;p&gt;HttpGet Create 方法调用没有设置选中项的 PopulateDepartmentsDropDownList 方法，因为对于新创建的课程来说，还没有确定归属的系。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Create()&lt;br/&gt;{&lt;br/&gt;    PopulateDepartmentsDropDownList();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;HttpGet Edit 方法则设置了当前选中的项目，基于当前被编辑课程的 DepartmentId。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    Course course &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Courses.Find(id);&lt;br/&gt;    PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(course);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;对于 Create 和 Edit 的 HttpPost 方法来说，在错误信息处理之后，都包含了设置当前选中项目的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;    ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;br/&gt;PopulateDepartmentsDropDownList(course.DepartmentID);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(course);&lt;/div&gt;&lt;p&gt;代码用来保证即使在显示错误的页面上，也会保持选中的项目。&lt;/p&gt;&lt;p&gt;在 &lt;em&gt;Views\Course\Create.cshtml&lt;/em&gt;, 在 Title 之前增加一个新的字段，允许用户输入课程编号。想之前演示的那样，脚手架没有生成主键字段，因为主键字段对用户没有意义。所以需要添加以便用户能够输入这个值。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.LabelFor(model &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; model.CourseID)&lt;br/&gt;&lt;/span&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.EditorFor(model &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; model.CourseID)&lt;br/&gt;    @Html.ValidationMessageFor(model &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; model.CourseID)&lt;br/&gt;&lt;/span&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;运行 Create 页面 ( 在课程的 Index 页面，点击 Create New&amp;nbsp; )，然后输入新的课程。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577951/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Course_create_page_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;点击 Create，在 Index 中应该可以看到包含新创建课程的列表。系的名称通过导航属性获取到，显示的数据是正确的。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577957/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Course_Index_page_showing_new_course_736f9946-27d1-405a-a098-25687c85db6b.png" alt="" width="650" height="714" /&gt;&lt;/p&gt;&lt;p&gt;运行编辑页面 ( 在课程的 Index 页面中在某个课程上选择 Edit )&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577963/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Course_edit_page_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;修改一些数据，然后点击 Save，可以看到更新之后的课程数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6-2&amp;nbsp; 增加教师的编辑页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在修改教师信息的时候，我们希望也能够修改教师的办公室分配。教师实体 Instructor 和办公室分配 OfficeAssignment存在一对一或者一对零的关系，这意味着你必须处理如下的状态：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;如果教师原来存在一个办公室分配，但是用户删除了它，那么，你必须移除并且删除这个办公室分配 OfficeAssignment 实体。&lt;/li&gt;&lt;li&gt;如果教师原来没有办公室分配，但是用户输入了一个，你必须创建一个新的办公室分配。&lt;/li&gt;&lt;li&gt;如果用户修改了原来的办公室分配，你必须修改当前的办公分配 OfficeAssignment 实体。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;打开 &lt;em&gt;InstructorController.cs&lt;/em&gt;，看一下 HttpGet Edit 方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    Instructor instructor &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Instructors.Find(id);&lt;br/&gt;    ViewBag.InstructorID &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SelectList(db.OfficeAssignments, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;InstructorID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Location&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, instructor.InstructorID);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(instructor);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;脚手架生成的代码不是我们希望的，它生成了一个下拉列表，但是我们希望是文本框，将这个方法使用下面的代码替换掉。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    Instructor instructor &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment)&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;        .Where(i &lt;/span&gt;=&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        .Single();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(instructor);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码中删除了 ViewBag 语句，增加了使用预先加载的相关 OfficeAssignment 和 Course 实体 ( 现在还不需要课程实体，一会就会用到 )。由于 Find 方法不能使用预先加载，所以这里使用 Where 和 Single 方法来获取教师。&lt;/p&gt;&lt;p&gt;将 HttpPost 的 Edit 方法使用下面的代码替换，这里处理了 OfficeAssignment 更新。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;[HttpPost]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id, FormCollection formCollection)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; instructorToUpdate =&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment)&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;        .Where(i &lt;/span&gt;=&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        .Single();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (TryUpdateModel(instructorToUpdate, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Courses&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; }))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment.Location))&lt;br/&gt;            {&lt;br/&gt;                instructorToUpdate.OfficeAssignment &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            db.Entry(instructorToUpdate).State &lt;/span&gt;=&lt;span style="color: #000000;"&gt; EntityState.Modified;&lt;br/&gt;            db.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;            ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(instructorToUpdate);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码中处理了如下的内容：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;从数据库中获取了教师 Instructor 实体，并且预先加载了相关的的办公室分配 OfficeAssignment 和课程 Course 导航属性。如同在 HttpGet 的 Edit 方法一样。&lt;/li&gt;&lt;li&gt;使用通过模型绑定获取的数据，更新 Instructor 实体，除了课程 Course 导航属性之外。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;If (TryUpdateModel(instructorToUpdate, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Courses&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }))&lt;/div&gt;&lt;p&gt;( 第二和第三个参数在属性名的前面没有前缀，而且没有被包含的属性列表 )，如果验证失败， TryUpdateModel 方法返回 false，程序将直接转到方法最后的 return View 语句。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;如果办公位置为空，设置 Instructor.OfficeAssignment 属性为 null，在 OfficeAssignment 表相关的行将会被删除。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment.Location))&lt;br/&gt;{&lt;br/&gt;    instructorToUpdate.OfficeAssignment &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;将修改保存到数据库中。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在 &lt;em&gt;Views\Instructor\Edit.cshtml&lt;/em&gt;, 在 Hire Date 字段的 div 元素之后，增加新的字段来编辑办公位置。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.LabelFor(model &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; model.OfficeAssignment.Location)&lt;br/&gt;&lt;/span&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.EditorFor(model &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; model.OfficeAssignment.Location)&lt;br/&gt;    @Html.ValidationMessageFor(model &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; model.OfficeAssignment.Location)&lt;br/&gt;&lt;/span&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;运行页面 ( 选中教师 Instructors ，点击某个教师的 Edit 链接 )&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577969/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Instructor_edit_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;修改办公室位置的值，然后保存 Save。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577975/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Changing_the_office_location.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;新的办公位置出现在 Index 页面上，打开数据库中的 OfficeAssgnment 表，可以看到表中的数据行。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577981/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Server_explorer_showing_changed_office_location.png" alt="" width="310" height="214" /&gt;&lt;/p&gt;&lt;p&gt;运行编辑页面，将办公位置 Office Location 清除掉，然后保存 Save。在 Index 页面上办公位置将显示为空白，在表中的行被删除了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577987/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Server_explorer_showing_deleted_office_location.png" alt="" width="321" height="193" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6-3&amp;nbsp; 在教师编辑页面增加课程分配&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;教师可以教授任意数量的课程。现在你需要扩展教师的编辑页面，增加通过一系列复选框分配可能的能力，如下所示。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577999/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Instructor_edit_page_with_courses_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;在课程 Course 和教师 Instructor 之间存在多对多的关系，这意味着你不需要直接访问表之间的关联。而是通过增加或者删除 Instructor. Course 实体来完成。&lt;/p&gt;&lt;p&gt;在 UI 界面上，与教师相关的课程被显示为一组复选框，在数据库中的每一门课程都有一个对应的复选框，教师当前教授的课程对应的复选框处于被选中状态。用户可以通过选中或者取消选中来改变教师教授的课程。如果课程的数量巨大，你可能需要采取其他的方式来显示这些数据，但是你可以使用类似的方式来控制导航属性以便创建和删除关系。&lt;/p&gt;&lt;p&gt;为了为视图提供复选框数据，你需要使用视图模型 ViewModel，在 ViewModels 文件夹中创建 AssignedCourseData.cs，使用下面的代码替换生成的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.ViewModels&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; AssignedCourseData&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CourseID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Title { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Assigned { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 InstructorController.cs 中，找到 HttpGet Edit 方法，调用通过视图模型为视图中复选框提供数据的新方法，如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;{&lt;br/&gt;    Instructor instructor &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment)&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;        .Where(i &lt;/span&gt;=&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        .Single();&lt;br/&gt;    PopulateAssignedCourseData(instructor);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(instructor);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; PopulateAssignedCourseData(Instructor instructor)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; allCourses =&lt;span style="color: #000000;"&gt; db.Courses;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; instructorCourses = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HashSet&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;(instructor.Courses.Select(c =&amp;gt;&lt;span style="color: #000000;"&gt; c.CourseID));&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; viewModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;AssignedCourseData&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; course &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; allCourses)&lt;br/&gt;    {&lt;br/&gt;        viewModel.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; AssignedCourseData&lt;br/&gt;        {&lt;br/&gt;            CourseID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; course.CourseID,&lt;br/&gt;            Title &lt;/span&gt;=&lt;span style="color: #000000;"&gt; course.Title,&lt;br/&gt;            Assigned &lt;/span&gt;=&lt;span style="color: #000000;"&gt; instructorCourses.Contains(course.CourseID)&lt;br/&gt;        });&lt;br/&gt;    }&lt;br/&gt;    ViewBag.Courses &lt;/span&gt;=&lt;span style="color: #000000;"&gt; viewModel;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;新创建的方法中，读取所有的课程实体，加载到视图模型中，对于每一个课程，检查这个课程是否存在于教师实体的 Courses 导航集合属性中。为了更加有效地遍历教师讲授的课程，将教师讲授的课程通过 HashSet 集合处理，课程中教师讲授的课程的 Assigned 属性被赋予 true。在视图中通过这个属性来判断复选框是否显示为选中状态。最后，这个集合通过 ViewBag 传递到视图中。&lt;/p&gt;&lt;p&gt;然后，增加当用户点击 Save 后执行的代码。将 HttpPost 中的 Edit 方法使用下面的代码替换掉，这里通过调用一个新的方法将教师 Instructor 的导航属性 Courses 更新。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;[HttpPost]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id, FormCollection formCollection, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] selectedCourses)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; instructorToUpdate =&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment)&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;        .Where(i &lt;/span&gt;=&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        .Single();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (TryUpdateModel(instructorToUpdate, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Courses&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; }))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment.Location))&lt;br/&gt;            {&lt;br/&gt;                instructorToUpdate.OfficeAssignment &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            UpdateInstructorCourses(selectedCourses, instructorToUpdate);&lt;br/&gt;&lt;br/&gt;            db.Entry(instructorToUpdate).State &lt;/span&gt;=&lt;span style="color: #000000;"&gt; EntityState.Modified;&lt;br/&gt;            db.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DataException)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;br/&gt;            ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists, see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;       }&lt;br/&gt;    }&lt;br/&gt;    PopulateAssignedCourseData(instructorToUpdate);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(instructorToUpdate);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; UpdateInstructorCourses(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] selectedCourses, Instructor instructorToUpdate)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (selectedCourses == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        instructorToUpdate.Courses &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; selectedCoursesHS = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HashSet&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;(selectedCourses);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; instructorCourses = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HashSet&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        (instructorToUpdate.Courses.Select(c &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; c.CourseID));&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; course &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; db.Courses)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (selectedCoursesHS.Contains(course.CourseID.ToString()))&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;instructorCourses.Contains(course.CourseID))&lt;br/&gt;            {&lt;br/&gt;                instructorToUpdate.Courses.Add(course);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (instructorCourses.Contains(course.CourseID))&lt;br/&gt;            {&lt;br/&gt;                instructorToUpdate.Courses.Remove(course);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;如果没有复选框被选中，在 UpdateInstructorCourse 方法中，使用一个空的集合来初始化 Courses 导航属性。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (selectedCourses == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    instructorToUpdate.Courses &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;然后，代码遍历数据库中所有的课程，如果课程的复选框被选中了，但是没有包含在教师 Insturctor 的 Courses 集合中。这个课程将会被加入到导航属性集合中。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (selectedCoursesHS.Contains(course.CourseID.ToString()))&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;instructorCourses.Contains(course.CourseID))&lt;br/&gt;    {&lt;br/&gt;        instructorToUpdate.Courses.Add(course);&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;如果课程没有被选中，但是在教师的导航属性 Courses 集合中，就从集合属性中删除掉。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (instructorCourses.Contains(course.CourseID))&lt;br/&gt;    {&lt;br/&gt;        instructorToUpdate.Courses.Remove(course);&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 Views\Instructor\Edit.cshtml 中，在 OfficeAssignment 区域的 div 之后，增加一个 Courses 区域，通过一组复选框来显示课程的状态。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br/&gt;    &amp;lt;table&amp;gt;&lt;br/&gt;        &amp;lt;tr&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @{&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; cnt = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;                List&lt;/span&gt;&amp;lt;ContosoUniversity.ViewModels.AssignedCourseData&amp;gt; courses =&lt;span style="color: #000000;"&gt; ViewBag.Courses;&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; course &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; courses) {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cnt++ % &lt;span style="color: #800080;"&gt;3&lt;/span&gt; == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;                        @:  &lt;/span&gt;&amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                    }&lt;br/&gt;                    @: &lt;/span&gt;&amp;lt;td&amp;gt; &lt;br/&gt;                        &amp;lt;input type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;checkbox&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                               name&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;selectedCourses&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                               value&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@course.CourseID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                               @(Html.Raw(course.Assigned &lt;/span&gt;? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;checked=\"checked\"&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;""&lt;/span&gt;)) /&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                        @course.CourseID @:  @course.Title&lt;br/&gt;                    @:&lt;/span&gt;&amp;lt;/td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                }&lt;br/&gt;                @: &lt;/span&gt;&amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            }&lt;br/&gt;    &lt;/span&gt;&amp;lt;/table&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;代码创建一个 HTML 的三列表格，每一列中显示课程的标题和编号，后面跟着一个复选框。复选框的名称是相同的 ( &amp;ldquo;selectedCourses&amp;rdquo; )，这样在模型绑定的时候就会被连接成一组。复选框的 value 属性设置为 CourseID。当提交页面的时候，选中的复选框代表的 CourseID 将以数组的形式传递给控制器。&lt;/p&gt;&lt;p&gt;在复选框被初始化的时候，选中课程对应的复选框的 checked 属性被设置为选中状态。&lt;/p&gt;&lt;p&gt;在修改了课程状态之后，当回到 Index 页面的时候，需要验证这些修改。因此，需要在页面的表格中增加一列，在这里不需要使用 ViewBag，因为需要的信息已经通过教师实体 Instructor 的导航属性 Courses 传递到页面了。&lt;/p&gt;&lt;p&gt;在 Views\Instuctor\Index.cshtml 中，在 &amp;lt;th&amp;gt;Office&amp;lt;/th&amp;gt; 之后，增加一个 &amp;lt;th&amp;gt;Course&amp;lt;/th&amp;gt; 的标题列，如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;tr&amp;gt; &lt;br/&gt;    &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt; &lt;br/&gt;    &amp;lt;th&amp;gt;Last Name&amp;lt;/th&amp;gt; &lt;br/&gt;    &amp;lt;th&amp;gt;First Name&amp;lt;/th&amp;gt; &lt;br/&gt;    &amp;lt;th&amp;gt;Hire Date&amp;lt;/th&amp;gt; &lt;br/&gt;    &amp;lt;th&amp;gt;Office&amp;lt;/th&amp;gt;&lt;br/&gt;    &amp;lt;th&amp;gt;Courses&amp;lt;/th&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt; &lt;/div&gt;&lt;p&gt;然后，在办公位置的单元格之后增加一个详细内容的单元格。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @{&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; course &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Courses)&lt;br/&gt;        {&lt;br/&gt;            @course.CourseID @:  @course.Title &lt;/span&gt;&amp;lt;br /&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;p&gt;运行 Instructor 的 Index 页面，检查教师的授课情况。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578005/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Instructor_index_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;点击 Edit 查看编辑页面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2578011/Windows-Live-Writer_Updating-Re.NET-MVC-Application-6-of-10h_AEF7_Instructor_edit_page_with_courses_2.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;修改一些课程的授课情况，然后保存 Save，修改的结果在 Index 页面中可以看到。&lt;/p&gt;&lt;p&gt;你已经完成了修改关联数据的工作。通过目前的课程你已经可以完成增、删、改、查所有的操作，但是还没有考虑并发问题。下一次我们将探讨并发问题，展示处理并发的方式，然后对已经完成的实体的增、删、改、查的代码增加并发处理。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2456181.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/18/2456181.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/13/2446430.html</id><title type="text">翻译：Contoso 大学 - 5 – 读取关联数据</title><summary type="text">在前面的课程中已经完成了 School 数据模型。在这次的课程中，将要读取和显示相关的数据，这里指的是 EF 通过导航属性加载的数据。</summary><published>2012-04-13T14:32:00Z</published><updated>2012-04-13T14:32:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/13/2446430.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/13/2446430.html"/><content type="html">&lt;p&gt;&lt;strong&gt;By&amp;nbsp;Tom Dykstra&lt;/strong&gt;, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform &amp;amp; Tools Content Team.&lt;/p&gt;&lt;p&gt;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application" target="_blank"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;全文目录：&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在前面的课程中已经完成了 School 数据模型。在这次的课程中，将要读取和显示相关的数据，这里指的是 EF 通过导航属性加载的数据。&lt;/p&gt;&lt;p&gt;下面的截图展示了你将好创建的页面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577838/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Courses_index_page_with_department_names.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577844/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Instructors_index_page_with_instructor_and_course_selected.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5 &amp;ndash; 1&amp;nbsp; 延迟，饿汉，以及显式加载关联数据&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;EF 有多种方式可以通过导航属性加载关联的数据。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;延迟加载 Lazy Loading。当实体第一次读取的时候，关联的数据并不会被获取。 实际上，当第一次你实际访问关联属性的时候，被导航属性关联的数据才会被自动的读取。 这可能导致多次查询被发送到数据库 &amp;ndash; 一次是读取实体本身， 对于关联的每个实体也需要分别读取。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577850/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Lazy_loading_example_2c44eabb-5fd3-485a-837d-8e3d053f2c0c.png" alt="" width="559" height="133" /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;饿汉加载&amp;nbsp; Eager Loaing。当实体加载的时候，相关联的数据也一起被加载。典型地用在一次连接查询返回所有需要的相关数据，通过使用 &lt;strong&gt;Include&lt;/strong&gt; 方法实现饿汉加载。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577856/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Eager_loading_example_33f907ff-f0b0-4057-8e75-05a8cacac807.png" alt="" width="539" height="130" /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;显式加载 Explict Loading。这种方式类似于延迟加载，除了需要在代码中显式获取数据。在你访问导航属性的时候，不会出现自动加载。你自己手动加载关联的数据，通过访问对象状态管理器来获取实体，调用 &lt;strong&gt;Collection.Load&lt;/strong&gt; 方法获取集合，或者通过调用持有单个实体的属性的 &lt;strong&gt;Reference.Load&lt;/strong&gt; 方法。( 在下面的示例中，如果你希望加载 Administrator 导航属性，你应该将 Collection( x=&amp;gt;x.Course&amp;nbsp; ) 替换为 Reference( x=&amp;gt;x.Administrator ) 。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577862/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Explicit_loading_example_79d8c368-6d82-426f-be9a-2b443644ab15.png" alt="" width="600" height="151" /&gt;&lt;/p&gt;&lt;p&gt;因为不会立即获取关联属性的值，延迟加载和显式加载又被称为延后加载。&lt;/p&gt;&lt;p&gt;一般来说，如果你知道你需要每个实体的关联属性，饿汉加载提供了最好的性能。因为只有一次查询被发送到数据库，比对每个实体都要向数据库发出一次查询要更加有效。例如，在上面的例子中，假设每个系都有相关的课程，饿汉加载只需要一次联合查询就可以获得。而使用延迟加载或者显式加载则需要 11 次查询。&lt;/p&gt;&lt;p&gt;从另外的角度来说，如果你不常访问实体的导航属性，或者仅仅访问一小部分实体的导航属性，延迟加载更加有效，因为饿汉加载会加载更多地不必要的数据。通常情况下，在关闭了延迟加载的情况下使用显式加载。一个关闭延迟加载的场景是在进行序列化的时候，当你知道不需要所有的导航属性数据加载。如果延迟加载启用，所有的导航属性将会自动加载，因为序列化会访问所有的属性。&lt;/p&gt;&lt;p&gt;数据库上下文默认支持延迟加载，有两种方法可以关闭延迟加载：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;对于特定的导航属性，在定义属性的时候取消 &lt;strong&gt;virtual&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;对于所有的导航属性，设置 &lt;strong&gt;LazyLoadingEnabled&lt;/strong&gt; 为假。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;延迟加载可能导致性能问题，例如，代码中没有指定使用饿汉加载或者显式加载，但是在处理大量实体的时候，遍历每个实体并访问其导航属性可能导致低效率 ( 因为多次访问数据库 )， 但是使用延迟加载不会出现问题。在代码使用延迟加载的时候临时禁用延迟加载可能导致出现问题。因为导航属性为 null 而导致代码访问对象失败。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5 -2&amp;nbsp; 创建显示系名称的课程页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;课程 Course实体包含一个所属系 Department 的导航属性，为了显示课程所属系的名称，你需要通过课程所属的系 Department 导航属性来获取系的名称 Name。&lt;/p&gt;&lt;p&gt;为课程实体 Course 创建一个控制器，使用与前面的学生 Student 相同的设置，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577868/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Add_Controller_dialog_box_for_Course_controller_c167c11e-2d3e-4b64-a2b9-a0b368b8041d.png" alt="" width="552" height="378" /&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Controllers\CourseController.cs&lt;/em&gt; ，找到 Index 方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ViewResult Index()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; courses = db.Courses.Include(c =&amp;gt;&lt;span style="color: #000000;"&gt; c.Department);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(courses.ToList());&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;自动生成的脚手架代码调用 Include 方法使用饿汉模式加载相关的系 Department 导航属性。&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Views\Course\Index.cshtml &lt;/em&gt;文件，使用下面的代码替换原有代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@model IEnumerable&amp;lt;ContosoUniversity.Models.Course&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&lt;br/&gt;@{&lt;br/&gt;    ViewBag.Title &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Courses&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&amp;lt;h2&amp;gt;Courses&amp;lt;/h2&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create New&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br/&gt;&amp;lt;table&amp;gt;&lt;br/&gt;    &amp;lt;tr&amp;gt;&lt;br/&gt;        &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br/&gt;        &amp;lt;th&amp;gt;Number&amp;lt;/th&amp;gt;&lt;br/&gt;        &amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;&lt;br/&gt;        &amp;lt;th&amp;gt;Credits&amp;lt;/th&amp;gt;&lt;br/&gt;        &amp;lt;th&amp;gt;Department&amp;lt;/th&amp;gt;&lt;br/&gt;    &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&lt;br/&gt;@foreach (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Model) {&lt;br/&gt;    &lt;/span&gt;&amp;lt;tr&amp;gt;&lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Edit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Edit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id=item.CourseID }) |&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id=item.CourseID }) |&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id=&lt;span style="color: #000000;"&gt;item.CourseID })&lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt;&lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.DisplayFor(modelItem &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; item.CourseID)&lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt;&lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.DisplayFor(modelItem &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; item.Title)&lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt;&lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.DisplayFor(modelItem &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; item.Credits)&lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt;&lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            @Html.DisplayFor(modelItem &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; item.Department.Name)&lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt;&lt;br/&gt;    &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;&lt;p&gt;这段代码对脚手架代码做了如下的修改：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;将标题从 Index 修改为 Course&lt;/li&gt;&lt;li&gt;将行的链接移到了左边&lt;/li&gt;&lt;li&gt;在列 Number 中显示了 CourseID 属性的值。( 脚手架不生成主键，因为通常没有字面的意义。在这里我们希望显示这个值而已 )&lt;/li&gt;&lt;li&gt;将最后一列标题从 DepartmentId 修改为 Department ( 系实体中的系名 )&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;注意，脚手架代码显示通过导航属性 Department 加载的系实体的 Name 属性值。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.DisplayFor(modelItem &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; item.Department.Name)&lt;br/&gt;&lt;/span&gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;p&gt;重新运行这个页面，( 在 Contoso 大学的首页中选择 Courses )来显示系名称的列表。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577874/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Courses_index_page_with_department_names_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5-3&amp;nbsp; 创建显示课程和注册信息的教师页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在这一节中，我们创建控制器和视图来显示教师实体。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577903/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Instructors_index_page_with_instructor_and_course_selected_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;这个页面使用下面的途径来读取和显示关联的数据：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;教师列表中的办公室分配 OfficeAssignment 实体。教师实体与办公室分配之间是一对一或者一对零的关系，你将使用饿汉模式来加载办公室分配实体。从前所述，饿汉模式适合于当你需要主键表关联数据的时候，在这里，你需要显示所有教师的办公室分配。&lt;/li&gt;&lt;li&gt;当用户选中一个教师的时候，需要显示这个教师相关的课程实体。教师和课程之间存在多对多的关系。你将使用饿汉模式加载课程和相关的系实体。在这里，延迟加载可能更加有效，因为仅仅需要显示选中的教师的课程，实际上，这个例子展示了如何使用饿汉模式加载导航属性中的导航属性。&lt;/li&gt;&lt;li&gt;当用户选择课程之后，相关的注册实体 Enrollments 将会显示出来。Course 和 Enrollment 实体存在一对多的关系。你将使用显式加载来处理 Enrollment 实体，以及相关的学生 Student 实体。( 由于默认支持延迟加载，所以显示加载不是必须的。这里专门演示显式加载 )&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;5-3-1&amp;nbsp; 创建教师页面的视图模型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;教师页面显示三个不同的表。因此，需要创建一个新的视图模型，通过三个属性表示出来，每一个持有一张表的数据。&lt;/p&gt;&lt;p&gt;在 &lt;em&gt;ViewModels &lt;/em&gt;文件夹中，创建&lt;em&gt; InstructorIndexData.cs&lt;/em&gt; &lt;em&gt;&amp;nbsp;&lt;/em&gt;，将生成的代码替换为以下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.ViewModels&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; InstructorIndexData&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Instructor&amp;gt; Instructors { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Course&amp;gt; Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5-3-2&amp;nbsp; 对选中的行增加一个样式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要通过不同的背景色来标识选中的行，为 UI 提供一种新的样式，将下面的代码增加到 Content/Site.css 文件中标记为 MISC 的节中，如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; MISC  &lt;br/&gt;----------------------------------------------------------&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br/&gt;.selectedrow &lt;br/&gt;&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt; &lt;br/&gt;    background-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #EEEEEE&lt;/span&gt;; &lt;br/&gt;}&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5-3-3&amp;nbsp; 创建教师控制器和视图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为教师实体类型创建一个控制器。使用类似前面 Student 控制器的方式创建，如下所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577909/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Add_Controller_dialog_box_for_Instructor_controller_f99c10aa-1efd-49d6-af1d-b00461616107.png" alt="" width="552" height="385" /&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Controllers\InstructorController.cs&lt;/em&gt; ，为 ViewModels 命名空间增加&amp;nbsp; using 引用。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;using ContosoUniversity.ViewModels;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;脚手架生成的代码仅仅对 OfficeAssignment 导航属性使用饿汉加载模式。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ViewResult Index()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; instructors = db.Instructors.Include(i =&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(instructors.ToList());&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;使用下面的代码替换原有的 Index 方法，读取关联的数据，通过 ViewModel 来保存。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index(Int32? id, Int32?&lt;span style="color: #000000;"&gt; courseID)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; viewModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; InstructorIndexData();&lt;br/&gt;    viewModel.Instructors &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment)&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt; i.Courses.Select(c =&amp;gt;&lt;span style="color: #000000;"&gt; c.Department))&lt;br/&gt;        .OrderBy(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.LastName);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (id != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        ViewBag.InstructorID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; id.Value;&lt;br/&gt;        viewModel.Courses &lt;/span&gt;= viewModel.Instructors.Where(i =&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id.Value).Single().Courses;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (courseID != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        ViewBag.CourseID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; courseID.Value;&lt;br/&gt;        viewModel.Enrollments &lt;/span&gt;= viewModel.Courses.Where(x =&amp;gt; x.CourseID ==&lt;span style="color: #000000;"&gt; courseID).Single().Enrollments;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(viewModel);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;方法通过查询串接收一个可选的教师 Id 和选中的课程，然后将所有需要的数据传递给视图。查询串通过页面上的 Select 超级链接提供。&lt;/p&gt;&lt;p&gt;代码首先创建 ViewModel 的实例，然后将教师实体列表保存在其中。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; viewModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; InstructorIndexData();&lt;br/&gt;viewModel.Instructors &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;    .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment);&lt;br/&gt;    .Include(i &lt;/span&gt;=&amp;gt; i.Courses.Select(c =&amp;gt;&lt;span style="color: #000000;"&gt; c.Department))&lt;br/&gt;    .OrderBy(i &lt;/span&gt;=&amp;gt; i.LastName);&lt;/div&gt;&lt;p&gt;代码使用饿汉模式加载 Instructor.OfficeAssignment 和 Instructor.Courses 导航属性。对于关联的 Course 实体，通过在 Inclue 中使用 Select 方法饿汉模式加载，结果使用 LastName 进行排序。&lt;/p&gt;&lt;p&gt;如果某个教师被选中了，选中的教师从 ViewModel 中的教师列表中被选出。视图模型的 Courses 属性通过教师的 Courses 属性加载相关的课程 Course 实体。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (id != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    ViewBag.InstructorID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; id.Value;&lt;br/&gt;    viewModel.Courses &lt;/span&gt;= viewModel.Instructors.Where(i =&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id.Value).Single().Courses;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Where 方法返回一个集合，但是这里的情况将仅仅返回一个教师实体，Single 方法将集合转化成一个单个的实体，以便访问这个实体的 Course 属性。&lt;/p&gt;&lt;p&gt;在你知道集合中仅仅包含一个实体的时候，可以使用 Single 方法。Single 方法在集合中为空的时候将会抛出异常，或者在集合中包含多于一个实体的时候也会抛出异常。另外一个替换的方法是 SingleOrDefault 方法，在集合为空的时候，这个方法返回 null。实际上，在这里还是会抛出异常 ( 试图在空引用上访问 Courses 属性的时候 )，异常的信息将会简单地说明这个问题，在调用 Single 方法的时候，还可以传递一个条件来代替通过 Where 传递的条件。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;.Single(i =&amp;gt; i.InstructorID == id.Value)&lt;/div&gt;&lt;p&gt;替换掉：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;.Where(I =&amp;gt; i.InstructorID == id.Value).Single()&lt;/div&gt;&lt;p&gt;下一步，如何选中了一个课程 Course，选中的课程从视图模型 ViewModel 的 Courses 属性中获取，然后，模型的 Enrollments 属性通过课程对象的 Enrollments 导航属性被加载。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (courseID != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    ViewBag.CourseID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; courseID.Value;&lt;br/&gt;    viewModel.Enrollments &lt;/span&gt;= viewModel.Courses.Where(x =&amp;gt; x.CourseID ==&lt;span style="color: #000000;"&gt; courseID).Single().Enrollments;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;最后，模型被传递到视图。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(viewModel);&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5-3-4&amp;nbsp; 修改教师 Instructor 视图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Views\Instructor\Index.cshtml&lt;/em&gt;, 使用如下的代码替换原有内容。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;@model ContosoUniversity.ViewModels.InstructorIndexData&lt;br/&gt;&lt;br/&gt;@{&lt;br/&gt;    ViewBag.Title &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Instructors&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&amp;lt;h2&amp;gt;Instructors&amp;lt;/h2&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;p&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create New&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br/&gt;&amp;lt;table&amp;gt; &lt;br/&gt;    &amp;lt;tr&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;Last Name&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;First Name&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;Hire Date&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;Office&amp;lt;/th&amp;gt;&lt;br/&gt;    &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;    @foreach (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Model.Instructors) &lt;br/&gt;    { &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; selectedRow = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (item.InstructorID ==&lt;span style="color: #000000;"&gt; ViewBag.InstructorID) &lt;br/&gt;        { &lt;br/&gt;            selectedRow &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;selectedrow&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;        } &lt;br/&gt;        &lt;/span&gt;&amp;lt;tr &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@selectedRow&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; valign=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;top&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt; &lt;br/&gt;            &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Select&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = item.InstructorID }) |&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Edit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Edit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = item.InstructorID }) |&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = item.InstructorID }) |&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id =&lt;span style="color: #000000;"&gt; item.InstructorID }) &lt;br/&gt;            &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;            &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @item.LastName &lt;br/&gt;            &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;            &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @item.FirstMidName &lt;br/&gt;            &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;            &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @String.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, item.HireDate) &lt;br/&gt;            &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;            &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                @if (item.OfficeAssignment &lt;/span&gt;!= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;                { &lt;br/&gt;                    @item.OfficeAssignment.Location  &lt;br/&gt;                } &lt;br/&gt;            &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;        &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;    } &lt;br/&gt;&lt;/span&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;&lt;p&gt;我们对原有的代码做了如下的变动：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;将标题从 Index 替换成Instructors&lt;/li&gt;&lt;li&gt;将行的链接移到了左边&lt;/li&gt;&lt;li&gt;删除了 FullName 列&lt;/li&gt;&lt;li&gt;增加了 Office 列，仅在 item.OfficeAssignment 非空的时候显示 item.OfficeAssignment.Location 属性。( 这里是一对一或者一对零的关系，可能没有关联的 OfficeAssignment 实体 )&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;    @if (item.OfficeAssignment &lt;/span&gt;!= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;    { &lt;br/&gt;        @item.OfficeAssignment.Location  &lt;br/&gt;    } &lt;br/&gt;&lt;/span&gt;&amp;lt;/td&amp;gt; &lt;/div&gt;&lt;ul&gt;&lt;li&gt;对选中教师对应行的 tr 元素，通过代码动态增加样式 class=&amp;rdquo;selectedrow&amp;rdquo;。这里通过前面创建的样式类对选中的行设置背景色。( 在你在表中增加多行的列时， valign 属性非常有用 )&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; selectedRow = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (item.InstructorID ==&lt;span style="color: #000000;"&gt; ViewBag.InstructorID) &lt;br/&gt;{ &lt;br/&gt;    selectedRow &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;selectedrow&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;} &lt;br/&gt;&lt;/span&gt;&amp;lt;tr &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@selectedRow&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; valign=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;top&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt; &lt;/div&gt;&lt;ul&gt;&lt;li&gt;在其他链接的前面，增加了一个名为 Select 的新的 ActionLink ，用来将选中的教师 Id 传递到 Index 方法。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;运行页面，查看教师列表，页面上显示了教师相关的 OfficeAssignment 导航属性的 Location 属性值，如果没有相关的办公室则显示为空。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577915/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Instructors_index_page_with_nothing_selected.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;如果 Views\Instructor\Index.cshtml 文件还打开，在 table 元素的后面，增加如下的代码，用来显示选中教师的课程列表。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@if (Model.Courses != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;{ &lt;br/&gt;    &lt;/span&gt;&amp;lt;h3&amp;gt;Courses Taught by Selected Instructor&amp;lt;/h3&amp;gt; &lt;br/&gt;&amp;lt;table&amp;gt; &lt;br/&gt;    &amp;lt;tr&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;th&amp;gt;Department&amp;lt;/th&amp;gt; &lt;br/&gt;    &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt; &lt;br/&gt;    @foreach (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Model.Courses) &lt;br/&gt;    { &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; selectedRow = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (item.CourseID ==&lt;span style="color: #000000;"&gt; ViewBag.CourseID) &lt;br/&gt;        { &lt;br/&gt;            selectedRow &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;selectedrow&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;        } &lt;br/&gt;    &lt;/span&gt;&amp;lt;tr &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@selectedRow&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt; &lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;            @Html.ActionLink(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Select&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { courseID =&lt;span style="color: #000000;"&gt; item.CourseID }) &lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;            @item.CourseID &lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;            @item.Title &lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;        &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;            @item.Department.Name &lt;br/&gt;        &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;    &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;    } &lt;br/&gt; &lt;br/&gt;&lt;/span&gt;&amp;lt;/table&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码读取 ViewModel 的 Courses 属性来显示课程列表。同时还提供了 Select 链接用来发送选中的课程 Id 给 Index 方法。&lt;/p&gt;&lt;p&gt;运行页面，选中一个教师，现在可以显示这个教师的课程列表，可以看到每个课程所属的系。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577921/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Instructors_index_page_with_instructor_selected.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;注意，如果选中的行没有被高亮显示，刷新一下浏览器，可能需要重新加载页面相关的样式表文件。&lt;/p&gt;&lt;p&gt;在刚刚增加的代码块之后，增加如下的代码，用来显示注册到选中课程的学生列表。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@if (Model.Enrollments != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;{ &lt;br/&gt;    &lt;/span&gt;&amp;lt;h3&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;        Students Enrolled &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Selected Course&amp;lt;/h3&amp;gt; &lt;br/&gt;    &amp;lt;table&amp;gt; &lt;br/&gt;        &amp;lt;tr&amp;gt; &lt;br/&gt;            &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt; &lt;br/&gt;            &amp;lt;th&amp;gt;Grade&amp;lt;/th&amp;gt; &lt;br/&gt;        &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;        @foreach (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Model.Enrollments) &lt;br/&gt;        { &lt;br/&gt;            &lt;/span&gt;&amp;lt;tr&amp;gt; &lt;br/&gt;                &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                    @item.Student.FullName &lt;br/&gt;                &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;                &amp;lt;td&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                    @Html.DisplayFor(modelItem &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; item.Grade) &lt;br/&gt;                &lt;/span&gt;&amp;lt;/td&amp;gt; &lt;br/&gt;            &amp;lt;/tr&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;        } &lt;br/&gt;    &lt;/span&gt;&amp;lt;/table&amp;gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码从视图模型读取 Enrollments 属性来显示注册到课程的学生列表，DisplayFor 方法住手方法用来是的在成绩为 null 的时候显示 &amp;ldquo;No grade&amp;rdquo;，如在这个属性的 DisplayFormat 特性中定义的那样。&lt;/p&gt;&lt;p&gt;运行页面，选中教师，然后选中一个课程来查看注册课程的学生和他们的成绩。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577927/Windows-Live-Writer_Reading-Re.NET-MVC-Application-5-of-10h1_ADC3_Instructors_index_page_with_instructor_and_course_selected_2.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5-3-5&amp;nbsp; 增加显式加载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开InstructorController.cs 文件，查看Index 方法如何获取注册学生的列表。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (courseID != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;{&lt;br/&gt;    ViewBag.CourseID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; courseID.Value;&lt;br/&gt;    viewModel.Enrollments &lt;/span&gt;= viewModel.Courses.Where(x =&amp;gt; x.CourseID ==&lt;span style="color: #000000;"&gt; courseID).Single().Enrollments;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在获取教师列表的时候，使用饿汉模式加载 Courses 导航属性值，以及 Department 导航属性的值。然后将结果保存到视图模型的 Courses 集合中，再从这个集合的一个实体中访问注册实体。因为没有对Course.Enrollements 属性指定饿汉加载，出现在页面上时将使用延迟加载。&lt;/p&gt;&lt;p&gt;如果仅仅禁用延迟加载而不采取其他的措施，Enrollments 属性将是 null ，而不管实际上有多少注册。在这种情况下，就必须要么指定饿汉加载，要么指定显式加载。你已经见到了如何使用饿汉加载，因为展示如何使用显式加载，将 Index 方法中替换为如下的代码，这里使用显式加载来读取 Enrollments 属性。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index(Int32? id, Int32?&lt;span style="color: #000000;"&gt; courseID)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; viewModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; InstructorIndexData();&lt;br/&gt;    viewModel.Instructors &lt;/span&gt;=&lt;span style="color: #000000;"&gt; db.Instructors&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.OfficeAssignment)&lt;br/&gt;        .Include(i &lt;/span&gt;=&amp;gt; i.Courses.Select(c =&amp;gt;&lt;span style="color: #000000;"&gt; c.Department))&lt;br/&gt;        .OrderBy(i &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; i.LastName);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (id != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        ViewBag.InstructorID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; id.Value;&lt;br/&gt;        viewModel.Courses &lt;/span&gt;= viewModel.Instructors.Where(i =&amp;gt; i.InstructorID ==&lt;span style="color: #000000;"&gt; id.Value).Single().Courses;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (courseID != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        ViewBag.CourseID &lt;/span&gt;=&lt;span style="color: #000000;"&gt; courseID.Value;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; selectedCourse = viewModel.Courses.Where(x =&amp;gt; x.CourseID ==&lt;span style="color: #000000;"&gt; courseID).Single();&lt;br/&gt;        db.Entry(selectedCourse).Collection(x &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; x.Enrollments).Load();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (Enrollment enrollment &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; selectedCourse.Enrollments)&lt;br/&gt;        {&lt;br/&gt;            db.Entry(enrollment).Reference(x &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; x.Student).Load();&lt;br/&gt;        }&lt;br/&gt;                        &lt;br/&gt;        viewModel.Enrollments &lt;/span&gt;=&lt;span style="color: #000000;"&gt; selectedCourse.Enrollments;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View(viewModel);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在获取了选中的 Course 实体后，新的代码显式加载课程的 Enrollments 导航属性。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;db.Entry(selectedCourse).Collection(x =&amp;gt; x.Enrollments).Load();&lt;/div&gt;&lt;p&gt;然后显式加载每个注册 Enrollment 实体相关的学生 Student 实体。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;db.Entry(enrollment).Reference(x =&amp;gt; x.Student).Load();&lt;/div&gt;&lt;p&gt;注意这里使用 Collection 方法来加载属性集合。对于单值得导航属性，使用 Reference 方法。再次运行程序，显示的页面并没有什么不同，虽然已经修改了获取数据的方式。&lt;/p&gt;&lt;p&gt;现在，你已经使用了三种加载方式 ( 延迟，饿汉，显式 )来加载导航属性相关的数据，下一次，我们将学习如何更新相关的数据。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2446430.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/13/2446430.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/12/2444866.html</id><title type="text">jQuery DatePicker 与ASP.NET的验证控件结合 Bug 处理</title><summary type="text">我们开发ASP.NET站点时，如果将jQuery UI Datepicker与ASP.NET的验证控件（如：RequiredFieldValidator）组合使用：&lt;asp:TextBoxID="txtDate"runat="server"&gt;&lt;/asp:TextBox&gt;&lt;asp:RequiredFieldValidatorID="reqDate"runat="server"ControlToValidate="txtDate"ErrorMessage="*</summary><published>2012-04-12T14:15:00Z</published><updated>2012-04-12T14:15:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/12/2444866.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/12/2444866.html"/><content type="html">&lt;p&gt;我们开发ASP.NET站点时，如果将jQuery UI Datepicker与ASP.NET的验证控件（如：RequiredFieldValidator）组合使用：&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="txtDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:RequiredFieldValidator&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="reqDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="txtDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ErrorMessage&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="*"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:RequiredFieldValidator&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;$(&lt;span style="color: #006080;"&gt;"#&amp;lt;%= txtDate.ClientID %&amp;gt;"&lt;/span&gt;).datepicker();&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;那么当我们在Datepicker中选择某个日期时就会出现&amp;ldquo;'length'为空或不是对象&amp;rdquo;的错误。这由于Datepicker的bug造成的，经过我的研究，找到了一个很简单的解决方法&amp;mdash;&amp;mdash;捕获Datepicker的onSelect事件，但不做任何处理： &lt;br /&gt;$(&lt;span style="color: #006080;"&gt;"#&amp;lt;%= txtDate.ClientID %&amp;gt;"&lt;/span&gt;).datepicker({&lt;br /&gt; onSelect: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(dateText, inst) {&lt;br /&gt;&lt;span style="color: #008000;"&gt;// 不做任何处理 &lt;/span&gt;&lt;br /&gt; }&lt;br /&gt;}); &lt;br /&gt;现在我们选择某个日期后就不会出现&amp;ldquo;'length'为空或不是对象&amp;rdquo;的错误了，而ASP.NET验证控件也可照常运行。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2444866.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/12/2444866.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/10/2441382.html</id><title type="text">翻译：Contoso 大学 - 4 - 创建更加复杂的数据模型</title><summary type="text">在前面的课程中，你已经创建了一个简单的由三个实体组成的数据模型。在这个课程中，你将要增加更多的实体，以及关系，使用数据标注特性来控制模型类的行为。</summary><published>2012-04-10T14:12:00Z</published><updated>2012-04-10T14:12:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/10/2441382.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/10/2441382.html"/><content type="html">&lt;p&gt;原文地址：&lt;a&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;全文目录：&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4 &amp;ndash; 创建更加复杂的数据模型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在前面的课程中，你已经创建了一个简单的由三个实体组成的数据模型。在这个课程中，你将要增加更多的实体，以及关系，使用数据标注特性来控制模型类的行为。&lt;/p&gt;&lt;p&gt;在完成的时候，实体类表示的完整数据模型如下所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577724/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_School_class_diagram_1.png" alt="" width="645" height="643" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-1 使用特性控制格式、验证以及数据库映射&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在这一节中，你将会看到如何使用特性来控制数据模型的格式化、验证以及数据库映射。然后在后继的节中，将要通过为已经创建的类、新创建的类增加特性，来创建完整的 School 数据模型。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-1-1 DisplayFormat 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于学生的注册日期来说，虽然你只关心注册的日期，但是现在的页面在日期之后还显示了时间。通过使用数据标注特性，可以通过一点代码就可以在所有的地方修补这个问题。看一下示例，你就可以为 Student 类的 EnrollmentDate 属性增加一个特性了。&lt;/p&gt;&lt;p&gt;在 &lt;em&gt;Models\Student.cs&lt;/em&gt; ，在开始部分为命名空间 &lt;strong&gt;System.ComponentModel.DataAnnotations&lt;/strong&gt; 增加一个 &lt;strong&gt;using&lt;/strong&gt; 语句，然后在 &lt;strong&gt;EnrollmentDate&lt;/strong&gt; 属性上增加一个 &lt;strong&gt;DisplayFormat&lt;/strong&gt; 的特性。如下所示：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Student&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; StudentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstMidName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [DisplayFormat(DataFormatString &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime EnrollmentDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;格式化串指定了在显示这个属性的时候仅仅使用短日期格式。&lt;strong&gt;ApplyFormatInEditMode &lt;/strong&gt;指定即使在将这个属性的值显示在文本框中进行编辑的时候也应用这个特性。( 有些字段不需要这些特殊设置，比如，在文本框中编辑货币的时候，就不会希望出现货币符号 )。&lt;/p&gt;&lt;p&gt;再次运行程序，你会注意到注册时间不再是长日期格式了，如果你查看其他的学生页面也会看到同样的结果。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577730/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Students_index_page_with_formatted_date_2.png" alt="" width="647" height="654" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-1-2&amp;nbsp; MaxLength 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还可以通过特性来指定数据验证规则和错误提示信息。假设你希望用户在输入名字的时候不能超过 50 个字符长度，对于这个限制，可以为 &lt;strong&gt;LastName&lt;/strong&gt; 属性和 &lt;strong&gt;FirstName&lt;/strong&gt; 属性增加 &lt;strong&gt;MaxLength&lt;/strong&gt; 特性，如下所示.&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Student&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; StudentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;, ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First name cannot be longer than 50 characters.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstMidName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [DisplayFormat(DataFormatString &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime EnrollmentDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;如果用户为 LastName 输入一个超长的名字，默认的错误信息就会显示出来，如果输入一个超长的 FirstName，你定制的错误信息会被显示出来。&lt;/p&gt;&lt;p&gt;运行程序，输入两个超过 50 个字符的超长名字，然后点击 Create 来查看错误信息。( 但是你需要输入一个正确的日期来通过验证 )&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577736/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Students_Create_page_with_name_length_errors_1.png" alt="" width="647" height="800" /&gt;&lt;/p&gt;&lt;p&gt;对于字符串属性总是指定最大长度是个好主意。如果没有这样做，在 CodeFirst 创建数据库的时候，相关的数据库中的列宽度就会被设置为字符串的最大长度，这可能会导致低效的数据库结构。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-1-3&amp;nbsp; Column 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还可以通过特性来控制你的模型类及属性如何映射到数据库。假设你已经使用 FirstMidName 来表示名字，因为属性也包含了中间名，但是你希望数据库中的列名为 FirstName，因为编写本地查询的用户习惯使用这个名字，要完成这种映射，你可以使用 &lt;strong&gt;Column&lt;/strong&gt; 特性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Column &lt;/strong&gt;特性在数据库创建的时候被使用。Student 的属性 FirstMidName 在数据库中将被命名为 FirstName。也就是说，当你的代码使用 Student.FirstMidName 的时候，数据将来自数据库中 Student 表的 FirstName 列 ( 如果你没有指定列名，默认将与属性同名 )&lt;/p&gt;&lt;p&gt;为 FirstMidName 增加列名的映射特性，如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Column(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstMidName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;再次运行程序，你会发现没有任何变化。( 不能仅仅运行程序，然后查看主页。你需要选择 Student 的 Index 页面，因为这将导致对数据库的访问，这会使数据库首先被自动删除，然后重建 )。实际上，如果你在服务器资源管理器中打开数据库，展开 Student 表，就会发现列名 FirstName。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577742/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Server_Explorer_showing_FirstName_column_1.png" alt="" width="281" height="391" /&gt;&lt;/p&gt;&lt;p&gt;在属性窗口，你还会发现与此列相关的字段被定义为 50 个字符长度，与你在前面增加的 MaxLength 特性相一致。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577748/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Properties_Window_showing_FirstName_column_length_1.png" alt="" width="310" height="311" /&gt;&lt;/p&gt;&lt;p&gt;在另外一些情况下，你还可以通过方法调用进行映射，后面就会看到。&lt;/p&gt;&lt;p&gt;在后面的段落中，你使用到更多的数据标注来扩展学校数据模型。在每节中，你要为实体创建一个类，或者修改前面创建的类。&lt;/p&gt;&lt;p&gt;注意：如果在完成所有的实体之间，你试图编译，可能会遇到编译错误。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-2 创建 Instructor 实体&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577754/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Instructor_entity_50d2377d-38ec-4053-92e5-14c8e083aaed.png" alt="" width="291" height="237" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;创建&lt;/em&gt;&lt;em&gt; Models\Instructor.cs&lt;/em&gt;, 使用下面的代码替换生成的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Instructor&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Int32 InstructorID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Column(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstMidName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [DisplayFormat(DataFormatString &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hire date is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hire Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime? HireDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; FullName &lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; LastName + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; FirstMidName;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Course&amp;gt; Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; OfficeAssignment OfficeAssignment { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;注意Student 和 Instructor 实体多数属性是类似的。在这个系列后面 实现继承 的部分，会对代码进行重构，使用继承来消除重复。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-2-1&amp;nbsp; Required 和 Display 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 LastName 属性上的特性指定这是一个必须字段，在编辑的文本框上的提示文本应该为 &amp;ldquo;Last Name&amp;rdquo; ( 代替属性名称，属性名中间没有空格 )，而且字段的值不能超过 50 个字符。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;[Display(Name&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;[MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-2-2&amp;nbsp; FullName 计算属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;FullName 是计算属性，返回其他两个属性计算出的结果。因此它只有 get 访问方法，而且在数据库中没有名为 FullName 的字段。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; FullName &lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; LastName + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; FirstMidName;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-2-3&amp;nbsp; Courses 和 OfficeAssignment 导航属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Courses 和 OfficeAssignment 属性是导航属性，像我们在前面说明的，它们典型地被定义为虚拟的 &lt;strong&gt;virtual&lt;/strong&gt;，以便 EF 的延迟加载特性可以提供帮助，另外，如果导航属性可以包含多个实体，它的类型必须为 &lt;strong&gt;ICollection&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;一个教师可以教授多门课程，所以 Courses 被定义为 Course 的集合。另一方面，一个教师仅有一间办公室，所以 OfficeAssignment 被定义为单个的 OfficeAssignment 实体 ( 如果没有办公室的话，可能为 null )。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Course&amp;gt; Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; OfficeAssignment OfficeAssignment { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-3 创建 OfficeAssignment 实体&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577760/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_OfficeAssignment_entity_d407b7d6-2bac-4d3d-9c78-79d975dce46e.png" alt="" width="221" height="167" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;创建&lt;/em&gt;&lt;em&gt; Models\OfficeAssignment.cs&lt;/em&gt;, 将生成的代码替换为以下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; OfficeAssignment&lt;br/&gt;    {&lt;br/&gt;        [Key]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; InstructorID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Office Location&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Location { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Instructor Instructor { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-3-1&amp;nbsp; Key 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 Instructor 和 OfficeAssignment 实体之间存在一对一或者一对零的关系。一个办公室分配仅仅存在于被分配给教师的时候。进而，它的主键也应该是 Instructor 实体的外键。但是 EF 并不能自动将 InstructorID 作为分配的主键，因为名字不符合约定，既不是 ID ，也不是类名加上 ID，因此，使用 Key 特性来标识这是一个主键。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;[Key]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; InstructorID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;在主键的属性名既不是 Id 也不是类名加上 ID 的时候，可以通过 Key 特性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-3-2&amp;nbsp; Instructor 导航属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Instructor 实体有一个可空的 OfficeAssignment 导航属性 ( 因为教师可能没有分配办公室 )，在 OfficeAssignment 实体上则有一个不可为空的 Instructor 导航属性 ( 因为办公室分配不可能在没有教师的情况下存在 )，当 Instructor 实体关联到 OfficeAssignment 实体的时候，它们可以通过导航属性相互引用对方。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-4&amp;nbsp; 修改 Course 实体&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577766/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Course_entity_0ee6c861-4b41-4aac-988c-7df3dd512f60.png" alt="" width="282" height="237" /&gt;&lt;/p&gt;&lt;p&gt;在 &lt;em&gt;Models\Course.cs&lt;/em&gt;, 将原来的代码替换为如下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Course&lt;br/&gt;    {&lt;br/&gt;        [DatabaseGenerated(DatabaseGeneratedOption.None)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Number&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CourseID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Title is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Title { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Number of credits is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Range(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&lt;span style="color: #800080;"&gt;5&lt;/span&gt;,ErrorMessage=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Number of credits must be between 0 and 5.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Credits { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Department&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; DepartmentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Department Department { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Instructor&amp;gt; Instructors { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-4-1&amp;nbsp; DatabaseGenerated 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 CourseID 属性上的DatabaseGenerated 特性，使用了 None 参数，指定主键将由用户提供，而不是通过数据库自动生成。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;[DatabaseGenerated(DatabaseGeneratedOption.None)]&lt;br/&gt;[Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Number&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CourseID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;默认情况下，EF 假设主键由数据库自动生成。这可以用于大多数场景下，但是，对于 Course 实体来说，你希望使用自定义的课程编号，例如：1000 序列表示一个系，2000 序列表示另外一个系等等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-4-2&amp;nbsp; 外键和导航属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 Course 实体中的外键属性和导航属性，反射了如下的关系：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;一个课程属于一个系，所以存在一个 DepartmentID 外键和一个 Department 导航属性：&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; DepartmentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Department Department { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;ul&gt;&lt;li&gt;一个课程可以被多个学生注册，所以存在一个 Enrollments 导航属性&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;ul&gt;&lt;li&gt;一个课程可能被多名教师教授，所以这里存在一个 Instructors 导航属性。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Instructor&amp;gt; Instructors { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-5&amp;nbsp; 创建 Department 实体&lt;/strong&gt;&lt;/p&gt;&lt;span class="pun"&gt;&lt;br /&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577772/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Department_entity_ad9fd6ba-455e-4365-b190-e2d7d86eeff1.png" alt="" width="239" height="236" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;创建 &lt;em&gt;Models\Department.cs,&lt;/em&gt; 使用下面的代码替换生成的内容， 如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Department&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; DepartmentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Department name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [DisplayFormat(DataFormatString&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:c}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Budget is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Column(TypeName&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;money&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;? Budget { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [DisplayFormat(DataFormatString&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode=&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start date is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime StartDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Display(Name&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Administrator&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;? InstructorID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Instructor Administrator { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Course&amp;gt; Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-5-1&amp;nbsp; Column 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;前面我们使用&amp;nbsp; Column 特性改变了默认的列名映射。在 Department 实体中，Column 特性被用来改变&amp;nbsp; SQL 数据类型映射，以便在数据库中使用&amp;nbsp; SQL Server 的&amp;nbsp; money 数据类型 。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Column(TypeName=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;money&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;? Budget { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;通常并不需要，因为 EF 会基于属性的 CLR 数据类型来选择合适的 SQL Server 数据类型。对于 CLR 中的 decimal 类型会映射到 SQL Server 中的 decimal 类型。但在这里，你知道这个列将会保存合计，所以 money 数据类型更加合适。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-5-2&amp;nbsp; 外键和导航属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;外键和导航属性反映了如下关系：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;一个系可能有或者没有一个系主任，系主任通常是教师。进而 InstructorID 属性包含了一个教师实体的外键。加在 int 类型后面的问号表示这是一个可空类型，导航属性名为 Administrator ，实际保存&amp;nbsp; Instructor 实体的引用。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;? InstructorID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Instructor Administrator { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;ul&gt;&lt;li&gt;一个系可能有多个课程，所以 Courses 是导航属性。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;注意：&lt;/p&gt;&lt;p&gt;默认情况下， EF 允许非空外键和多对多关系的级联删除。这可能会导致环形删除，在你的初始化代码运行的时候导致异常。例如，如果你没有定义 Department.InstructorID 属性作为可空类型，在初始化的时候，你会得到如下的异常："The referential relationship will result in a cyclical reference that's not allowed."&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-6&amp;nbsp; 修改&amp;nbsp; Student 实体&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577778/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Student_entity_7538216a-d542-4ef5-a60d-4e358684687c.png" alt="" width="287" height="220" /&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Models\Student.cs&lt;/em&gt;, 将早前的代码替换为如下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Student&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; StudentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First name is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Column(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FirstName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [MaxLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstMidName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [Required(ErrorMessage &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enrollment date is required.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [DisplayFormat(DataFormatString &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ApplyFormatInEditMode = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        [Display(Name &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enrollment Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime? EnrollmentDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; FullName &lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; LastName + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; FirstMidName;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这段代码中仅仅增加了一些你已经见过的特性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-7&amp;nbsp; 修改 Enrollment 实体&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577784/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Enrollment_entity_393c0a6c-86f1-4563-8ef8-fb552a683e27.png" alt="" width="211" height="221" /&gt;&lt;/p&gt;&lt;p&gt;打开&amp;nbsp; Models\Enrollment.cs，使用如下代码替换原来的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Enrollment&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; EnrollmentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CourseID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; StudentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        [DisplayFormat(DataFormatString&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:#.#}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,ApplyFormatInEditMode=&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;,NullDisplayText=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No grade&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;? Grade { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Course Course { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Student Student { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-7-1&amp;nbsp; 外键和导航属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;外键和导行属性反映了如下的关系：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;一条注册信息用于单个课程，所以存在一个 CourseID 外键属性和一个 Course 导航属性。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CourseID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Course Course { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;ul&gt;&lt;li&gt;一条注册信息用于一个学生， 所以存在一个 StudentID 外键和一个&amp;nbsp; Student 导航属性。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; StudentID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Student Student { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4-7-2&amp;nbsp; 多对多关系&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在学生实体和课程实体之间存在多对多的关系。在数据库中，Enrollment 实体在两张表之间承担了多对多的关联。这意味着 Enrollment 表中还包含了关联表中额外的数据 ( 在这里， 一个主键和一个成绩 Grade 属性 )。&lt;/p&gt;&lt;p&gt;下图展示了在实体图中的关系。( 这张图使用 EF 的设计器生成，创建这种图不是这个系列关注的内容，这里仅仅用来说明 )。&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577790/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Student-Course_many-to-many_relationship_6cc6bf29-0d5f-465f-92c8-53b5f975bff4.png" alt="" width="369" height="479" /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;每个关联线的两端有一个 1 和一个星 *，表示一对多的关系。&lt;/p&gt;&lt;p&gt;如果注册表中不包含成绩信息，那就可以仅仅包含两个外键 CourseId 和 StudentId。在这中情况下，在关联表中就没有额外的信息 ( 或者是纯的链接表 )，你也就完全没有必要创建这个注册的模型。教师 Instructor 和课程 Course 实际直接使用多对多关联，如你所见，在它们之间没有其他的实体。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577796/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Instructor-Course_many-to-many_relationship_0cb90bba-b4e6-460a-bcdc-f6c2fb0c5447.png" alt="" width="348" height="492" /&gt;&lt;/p&gt;&lt;p&gt;在数据库中需要一个关联表，如下所示。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577802/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Instructor-Course_many-to-many_relationship_tables_03e042cf-db89-4b4c-985a-e458351ada76.png" alt="" width="527" height="333" /&gt;&lt;/p&gt;&lt;p&gt;EF 将会自动创建 CourseInstructor 表，你可以间接地读取或者更新其中的数据，通过读写 Instructor.Courses 和 Course.Instructors&amp;nbsp; 导航属性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-7-3&amp;nbsp; DisplayFormat 特性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在成绩 Grade 属性上的 DisplayFormat 特性指定数据如何被格式化。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[DisplayFormat(DataFormatString=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:#.#}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,ApplyFormatInEditMode=&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;,NullDisplayText=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;No grade&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;? Grade { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;ul&gt;&lt;li&gt;成绩显示为通过圆点分割的两个数字，例如：3.5 或者 4.0&lt;/li&gt;&lt;li&gt;在编辑模式 ( 例如文本框中 )也需要这样显示。&lt;/li&gt;&lt;li&gt;如果没有成绩 ( 在 decimal 后面的问号表示这是可空类型 )，显示 &amp;ldquo;No&amp;rdquo;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4-8 实体关系图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面是通过 EF 设计器创建的学校实体关系图。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577808/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_School_data_model_diagram.png" alt="" width="537" height="728" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;除了多对多的关联线，以及一对多的关联线。还可以看到在 Instructor 与 OfficeAssignment之间的一对一或一对零的关联线，Instructor 与 Department 实体之间的零或一对多的关联线。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-9&amp;nbsp; 定制数据库上下文&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下一步将要为 SchoolContext 增加一些新的实体，通过 Fluent API 调用定义一些映射关系( 这个 API 被称为流畅的，是因为经常将一连串的调用写在一行语句中 )。有些时候你需要通过调用方法而不是使用特性，因为对于某些特定的功能没有合适的特性可用，如果存在的话，可以在使用特性和方法之间进行选择。( 有些人不喜欢使用特性 )&lt;/p&gt;&lt;p&gt;将&lt;em&gt; &lt;em&gt;DAL\SchoolContext.cs &lt;/em&gt;&lt;/em&gt;中的代码替换为如下内容：&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.Entity;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.Entity.ModelConfiguration.Conventions;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SchoolContext : DbContext&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Course&amp;gt; Courses { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Department&amp;gt; Departments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Enrollment&amp;gt; Enrollments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Instructor&amp;gt; Instructors { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Student&amp;gt; Students { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;OfficeAssignment&amp;gt; OfficeAssignments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br/&gt;        {&lt;br/&gt;            modelBuilder.Conventions.Remove&lt;/span&gt;&amp;lt;PluralizingTableNameConvention&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;            modelBuilder.Entity&lt;/span&gt;&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;                .HasOptional(p &lt;/span&gt;=&amp;gt; p.OfficeAssignment).WithRequired(p =&amp;gt;&lt;span style="color: #000000;"&gt; p.Instructor);&lt;br/&gt;            modelBuilder.Entity&lt;/span&gt;&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;                .HasMany(c &lt;/span&gt;=&amp;gt; c.Instructors).WithMany(i =&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;                .Map(t &lt;/span&gt;=&amp;gt; t.MapLeftKey(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CourseID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                    .MapRightKey(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;InstructorID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                    .ToTable(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CourseInstructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;            modelBuilder.Entity&lt;/span&gt;&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;                .HasOptional(x &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; x.Administrator);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;在 OnModelCreating 方法中的新的语句指定了如下关系：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;在 Instructor 和 OfficeAssignment 之间一对一或者一对零的关系&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;modelBuilder.Entity&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;    .HasOptional(p &lt;/span&gt;=&amp;gt; p.OfficeAssignment).WithRequired(p =&amp;gt; p.Instructor);&lt;/div&gt;&lt;ul&gt;&lt;li&gt;在 Instructor 和 Course 实体之间多对多的关系。代码中指定了关联表及其列名。EF CodeFirst 不需要这些代码就可以自动为你配置关系，但是，如果没有调用它，你会得到默认的名称，例如对于 InstructorID 列来说得到 InstructorInstructorID 。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;modelBuilder.Entity&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;    .HasMany(c &lt;/span&gt;=&amp;gt; c.Instructors).WithMany(i =&amp;gt;&lt;span style="color: #000000;"&gt; i.Courses)&lt;br/&gt;    .Map(t &lt;/span&gt;=&amp;gt; t.MapLeftKey(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CourseID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        .MapRightKey(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;InstructorID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        .ToTable(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CourseInstructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;/div&gt;&lt;ul&gt;&lt;li&gt;在 Instructor 和 Department 表之间的零对多或者一对多关系，或者说，一个系可能有也可能没有一个教师被作为系主任，作为系主任的教师通过导航属性 Department.Administrator 表示。&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;modelBuilder.Entity&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;    .HasOptional(x &lt;/span&gt;=&amp;gt; x.Administrator);&lt;/div&gt;&lt;p&gt;关于更加详细的 Fluent API 语法说明，可以参见博客 &lt;a href="http://blogs.msdn.com/b/aspnetue/archive/2011/05/04/entity-framework-code-first-tutorial-supplement-what-is-going-on-in-a-fluent-api-call.aspx"&gt;Fluent API&lt;/a&gt; 。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-10&amp;nbsp; 使用测试数据初始化数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在前面的课程中，你已经创建了 &lt;em&gt;DAL\SchoolInitializer.cs &lt;/em&gt;用测试数据初始化数据库，现在使用下面的代码替换掉原有的代码，以便使用新创建的实体。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.Entity;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.Models;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContosoUniversity.DAL&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; SchoolInitializer : DropCreateDatabaseIfModelChanges&amp;lt;SchoolContext&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Seed(SchoolContext context)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Student&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Carson&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Alexander&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2005-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Meredith&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Alonso&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2002-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Arturo&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Anand&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2003-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Gytis&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Barzdukas&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2002-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Yan&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,      LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Li&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,        EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2002-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Peggy&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Justice&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2001-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Laura&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Norman&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2003-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Nino&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Olivetto&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,  EnrollmentDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2005-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) }&lt;br/&gt;            };&lt;br/&gt;            students.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.Students.Add(s));&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Instructor { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Kim&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Abercrombie&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, HireDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1995-03-11&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Instructor { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Fadi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Fakhouri&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    HireDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2002-07-06&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Instructor { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Roger&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Harui&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,       HireDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1998-07-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Instructor { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Candace&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Kapoor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,      HireDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2001-01-15&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Instructor { FirstMidName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Roger&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   LastName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Zheng&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,       HireDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2004-02-12&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) }&lt;br/&gt;            };&lt;br/&gt;            instructors.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.Instructors.Add(s));&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; departments = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Department&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;English&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     Budget = &lt;span style="color: #800080;"&gt;350000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), InstructorID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Mathematics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Budget = &lt;span style="color: #800080;"&gt;100000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), InstructorID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Engineering&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Budget = &lt;span style="color: #800080;"&gt;350000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), InstructorID = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Department { Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Economics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   Budget = &lt;span style="color: #800080;"&gt;100000&lt;/span&gt;, StartDate = DateTime.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;2007-09-01&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), InstructorID = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt; }&lt;br/&gt;            };&lt;br/&gt;            departments.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.Departments.Add(s));&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; courses = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Course&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;1050&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Chemistry&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,      Credits = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;4022&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Microeconomics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Credits = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;4041&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Macroeconomics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Credits = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;1045&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Calculus&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,       Credits = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;3141&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Trigonometry&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,   Credits = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;2021&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Composition&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    Credits = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;2042&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Literature&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     Credits = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Instructor&amp;gt;&lt;span style="color: #000000;"&gt;() }&lt;br/&gt;            };&lt;br/&gt;            courses.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.Courses.Add(s));&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;6&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; enrollments = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Enrollment&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;1050&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;4022&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;4041&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;1045&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;3141&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;2021&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;1050&lt;/span&gt;&lt;span style="color: #000000;"&gt;            },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;1050&lt;/span&gt;&lt;span style="color: #000000;"&gt;,           },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;4022&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;4041&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;1045&lt;/span&gt;&lt;span style="color: #000000;"&gt;            },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Enrollment { StudentID = &lt;span style="color: #800080;"&gt;7&lt;/span&gt;, CourseID = &lt;span style="color: #800080;"&gt;3141&lt;/span&gt;, Grade = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;            };&lt;br/&gt;            enrollments.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.Enrollments.Add(s));&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; officeAssignments = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;OfficeAssignment&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OfficeAssignment { InstructorID = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, Location = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Smith 17&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OfficeAssignment { InstructorID = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;, Location = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Gowan 27&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OfficeAssignment { InstructorID = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, Location = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Thompson 304&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;            };&lt;br/&gt;            officeAssignments.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.OfficeAssignments.Add(s));&lt;br/&gt;            context.SaveChanges();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;像在前面一样，大多数的代码是简单地创建实体对象，通过必须的属性加载简单的测试数据，注意 Course 实体，它和 Instructor 实体之间存在多对多的关联。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; courses = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Course { CourseID = &lt;span style="color: #800080;"&gt;1050&lt;/span&gt;, Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Chemistry&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,      Credits = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, DepartmentID = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, Instructors = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List() },&lt;br/&gt;    ...&lt;br/&gt;};&lt;br/&gt;courses.ForEach(s &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; context.Courses.Add(s));&lt;br/&gt;context.SaveChanges();&lt;br/&gt;&lt;br/&gt;courses[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;].Instructors.Add(instructors[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;...&lt;br/&gt;context.SaveChanges();&lt;/span&gt;&lt;/div&gt;&lt;p&gt;当创建 Course 对象的时候，通过创建空的集合初始化了 Instructor 导航属性，使用代码 Instructors = new List()。这使得为课程相关的教师可以通过 Instructors.Add 方法加入，如果没有创建空的集合列表，你就不能增加这些关系，因为 Instructors 属性为 null，不能调用 Add 方法。&lt;/p&gt;&lt;p&gt;注意：记住，在发布应用到&amp;nbsp; Web 服务器上的时候，你必须删除所有的在数据库中的种子数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4-11&amp;nbsp; 删除和重建数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;重新运行，选择 Student 页面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577814/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Students_index_page_with_formatted_date_3.png" alt="" width="647" height="654" /&gt;&lt;/p&gt;&lt;p&gt;页面像从前一样，但是底层的数据库已经被重建了。&lt;/p&gt;&lt;p&gt;如果你没有看到学生页面，而是看到一个错误页面，提示说 School.sdf 文件正在被使用 ( 见下图 )，你需要重新打开服务器资源管理器，然后关闭与数据库的连接，然后重试一下。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577820/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_School.sdf_in_use_error_message_338c0a67-46a1-4c46-a2e0-2e050dfcd7e7.png" alt="" width="641" height="415" /&gt;&lt;/p&gt;&lt;p&gt;在查看学生页面之后，重新打开服务器资源管理器，展开表，可以看到新创建的所有表。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577826/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Server_Explorer_showing_School_tables.png" alt="" width="281" height="358" /&gt;&lt;/p&gt;&lt;p&gt;另外，EdmMetadata 表不是我们创建的，还有 CourseInstructor，如前所述，这是在 Instructor 和 Course 实体之间的链接表。&lt;/p&gt;&lt;p&gt;鼠标右击 CourseInstructor 表，选择显示数据，可以看到通过课程 Course.Instructors 导航属性增加的教师实体。&lt;/p&gt;&lt;span class="pun"&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577832/Windows-Live-Writer_Creating-a.NET-MVC-Application-4-of-10h1_B662_Table_data_in_CourseInstructor_table_4c4d2dc2-0c0c-498a-8199-04860c7a9bd1.png" alt="" width="328" height="311" /&gt;&lt;/span&gt;&lt;p&gt;现在你已经获得了一个更加复杂的数据模型以及关联的数据库，在后继的课程中，你可以学到通过不同的途径访问关联数据。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2441382.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/10/2441382.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/08/2438156.html</id><title type="text">翻译：Contoso 大学 - 3 - 排序、过滤及分页</title><summary type="text">在上一个课程中，我们已经学习了如何使用 EF 对 Student 实体进行增、删、改、查处理。这次的课程我们将对学生的 Index 页面加入排序、过滤以及分页的功能。还要创建一个页面完成简单的分组。</summary><published>2012-04-08T14:48:00Z</published><updated>2012-04-08T14:48:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/08/2438156.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/08/2438156.html"/><content type="html">&lt;p&gt;目录&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application" target="_blank"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在上一个课程中，我们已经学习了如何使用 EF 对 Student 实体进行增、删、改、查处理。这次的课程我们将对学生的 Index 页面加入排序、过滤以及分页的功能。还要创建一个页面完成简单的分组。&lt;/p&gt;&lt;p&gt;下面的截图展示了完成之后的页面，列的标题作为链接支持用户通过点击完成排序，点击标题可以在升序和降序之间进行切换。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577682/Windows-Live-Writer_23721db860e2_B5FA_Students_Index_page_with_paging_1.png" alt="" width="647" height="651" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-1&amp;nbsp; 在 Students 的 Index 页面增加列标题链接&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为 Index 页面增加排序的功能，我们需要修改 Student 控制器的 Index 方法，还需要为 Student 视图增加代码。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-1-1&amp;nbsp; 为 Index 方法增加排序功能&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开&lt;em&gt; Controllers\StudentController.cs&lt;/em&gt;，将 Index 方法替换为如下的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Index(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sortOrder)&lt;br /&gt;{&lt;br /&gt;    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;    ViewBag.DateSortParm = sortOrder == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; db.Students&lt;br /&gt;                   &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; s;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (sortOrder)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;            students = students.OrderByDescending(s =&amp;gt; s.LastName);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;            students = students.OrderBy(s =&amp;gt; s.EnrollmentDate);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;            students = students.OrderByDescending(s =&amp;gt; s.EnrollmentDate);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;            students = students.OrderBy(s =&amp;gt; s.LastName);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(students.ToList());&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;这段代码从 URL 中接收名为 &lt;strong&gt;sortOrder&lt;/strong&gt; 的参数，这个参数由 ASP.NET MVC 作为参数传递给 Action 方法。这个参数可以是&amp;nbsp; &amp;ldquo;&lt;strong&gt;Name&lt;/strong&gt;&amp;rdquo; 或者 &amp;ldquo;&lt;strong&gt;Date&lt;/strong&gt;&amp;rdquo;， 可能还有一个空格隔开的 &lt;strong&gt;desc&lt;/strong&gt; 来指定降序。&lt;/p&gt;&lt;p&gt;当第一次请求 Index 的时候，没有参数，学生使用 &lt;strong&gt;LastName&lt;/strong&gt; 的升序顺序显示。这是通过 &lt;strong&gt;switch&lt;/strong&gt; 的 &lt;strong&gt;default&lt;/strong&gt; 代码段指定的，当用户点击一个列的标题链接的时候，合适的 &lt;strong&gt;sortOrder&lt;/strong&gt; 值需要通过查询字符串传递进来。&lt;/p&gt;&lt;p&gt;两个 ViewBag 变量用来为视图提供合适的查询字符串链接值。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;ViewBag.DateSortParm = sortOrder == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;/div&gt;&lt;p&gt;这里使用了条件语句，第一个用来指定当 sortOrder 参数为 null 或者空串的时候， ViewBag.NameSortParm 应用被设置为 Name desc，其他情况下，应该被设置为空串。&lt;/p&gt;&lt;p&gt;这里有四种可能，依赖于当前的排序情况：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;如果当前的排序规则为 LastName 升序，那么，LastName 链接应该设置为降序，Enrollment Date 链接必须被设置为按日期升序。&lt;/li&gt;&lt;li&gt;如果当前的排序规则为 LastName 降序，那么，LastName 链接应该设置为升序，排序串应该为空串，日期为升序。&lt;/li&gt;&lt;li&gt;如果当前排序的规则为 Date 升序，那么，链接应该为 LastName 升序和日期升序。&lt;/li&gt;&lt;li&gt;如果当前的排序规则为 Date 降序，那么，链接应该为 LastName 升序和日期降序。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;方法中使用 LINQ to Entities 来指定排序，在 switch 之前，代码首先创建一个 IQueryable 变量，在 switch 语句中修改这个查询表达式，最后调用 ToList 方法。在创建和修改查询表达式 IQueryable 的时候，并没有将查询发送到数据库中执行，查询直到将 IQueryable 对象驼工调用类似 ToList 方法转换到集合对象的时候才会执行，因此，代码中查询直到最后的 return View 才会被执行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-2-2&amp;nbsp; 为 Index 视图增加列标题链接&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;em&gt;Views\Student\Index.cshtml&lt;/em&gt;，使用如下的代码替换标题行中的 &amp;lt;tr&amp;gt; 和 &amp;lt;th&amp;gt; 元素。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { sortOrder=ViewBag.NameSortParm })&lt;br /&gt;    &amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&lt;br /&gt;        First Name&lt;br /&gt;    &amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enrollment Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { sortOrder=ViewBag.DateSortParm })&lt;br /&gt;    &amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;&lt;p&gt;这段代码使用 ViewBag 属性来设置超级链接中包含适当的查询字符串。&lt;/p&gt;&lt;p&gt;运行页面，点击列标题，来验证排序是否正常。&lt;/p&gt;&lt;p&gt;&lt;img src="data:image/png;base64,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K2KmQbMxYqZspjx2szlxDCdP5STAnDhTtwubP61ePvDyK4899vg//dM/5fP5n/3sZ88///zAwMDrr79+7Nixqamp99577+OPP758+fL169dv3769uLi4vLz85Zdftqj817/+9eHDh1999dXKysri4uKdO3du3rw5Nzf36aefXrhw4fTp00NDQ4cOHerv7//+97//v/7mbw68/MrluauTp99ZP5Uf1bg5QSoDzLA4tklsFni2UTli85jCZlsem7KZ4TlxDKeCyluO58Rpmn42v3fho2vX/3zg5Vf+19/8zTe+8Y0f/OAHTz75ZF9fn1hUPnz48IkTJyqVivhhr9nZ2Zs3b965c2dxcXFlZeWrr776y1/+8te//lWhstyGPT8/Lzd8nTx58vDhwwcOHNi3b9/3v//9xx57/G//7u9LpQN3793fXnbv/iIMBkvGFlW7/0DY/cWlzuxBqm1xqeGwB7ANtMbyem0TSlUqHfjbv/v7xx57/Bvf+MYTTzzx5JNP/vznP3/++edffvnl11577ciRIydPnjx79uyFCxfoVq+lpSUzlb/44otGo3H//v16vX79+nWxtPz++++fOnVqaGjo9ddf379//759+/7t3/5t9+7djz3+OAwGg8FgMGr/8A//8I//+I979ux58sknn3nmmf7+/v379x88ePCNN94YGhqanJx87733Ll68WKvVxKLy/fv3G43GF198oVCZgnlxcXFhYUEmsaenp4MgGBkZefPNNw8ePPjiiy/+4he/+PGPf7xnz57e3t7vfe973/nOd7797W9/61vf+udQ3/zmN7/5zW/+MwRBEARlQ9/61rf+5V/+5V//9V97e3v37Nnzox/9qFgsPvvssy+++OIrr7wiAuXR0dEgCMSves3Nzd28eXNhYWFxcVEg+eHDhwLHnMpLS0v37t27devW/Px8tVq9ePHiuXPnpqamhoaG3njjjd/97nf79+9/7rnnfvaznz311FM//OEP8/n8nj17/uM//uOJJ5544okn/h2CIAiCsiSBvz179vznf/7nj370o6effnrfvn3PPffciy+++PLLL//+978vl8vHjx+fmpo6d+6c2H09Pz9/69ate/fuif+XQqFys9kUVJbvR+nh8tmzZ8fHx48dO/bGG28cOnTo5ZdffvHFF3/5y18+88wzP//5z4vF4k9+8pOnn376qaeeehKCIAiCsqSnnnrq6aef/slPfvLTn/70F7/4xbPPPvv888/v37//lVde+f3vf3/48OFjx46Nj4+LFWUWKMt3ogSVm81mi8ry/Si55+vWrVvyxeUPPvggCAIB5nK5/Nprr7366qsHDhzYv3//r3/961/96lfPPffcs88+29fX19fX98wzzzzzzDN9EARBEJQNPfvss88999yvfvWrX//61/v37z9w4MCrr7762muvlctlgeQgCD744IM//elPYkX51q1bcp+XfCdKobJMYtNw+c9//vOVK1cuXbp08eLF999/X4D5+PHjR44c+cMf/jA4OHjw4MFXXnmlVCr95je/eemll1588cUXX3zxhRdeeOGFF16EIAiCoGzopZde+s1vflMqlV555ZWDBw8ODg7+4Q9/OHLkyPHjxwWS33///YsXL166dEn8P1E0UKbpa05lGi7fv3//9u3bN27cmJubm5mZuXjx4gcffHD27NnJycnR0dGhoSHf9w8fPvz6668PDg4eOnTo4MGDBw8efPXVV3/729++CkEQBEHZkMDfoUOHBgcHX3/99cOHD/u+PzQ0NDo6Ojk5efbs2Q8++ODixYszMzNzc3M3bty4ffv2/fv3aaBspvJf/vIXGi4/ePBA/Cy2BPPHH388PT197ty5IAgEm48fP3706NG33nrL9/1yuXz48OE3IAiCIChLOnz4cLlc9n3/rbfeOnr06PHjxwWPgyA4d+7c9PQ0RbL4ic0HDx7QQFmkryMq6+GyeHd5cXHx7t27AsxXrlypVquffPLJRx99dP78+XPnzp05c6ZSqUxOTo6Pj4+NjY2Ojo6MjAxDEARBUJY0MjIyOjo6NjY2Pj4+OTlZqVTOnDlz7ty58+fPf/TRR5988km1Wr1y5YpA8t27dxcXF8U7ynqgzKkswmUjmG/evDk/Pz83N3fp0qVPPvnk4sWLFy5cOH/+/Hvvvffuu+++8847Z86cCYLgNARBEARlSUEQnDlz5p133nn33Xffe++98+fPX7hw4eLFi5988smlS5fm5ubm5+dv3rxpQzINlCMqO8AsUtm3b9/+/PPPr1+/fvXq1dnZ2Wq1+tlnnwk8f/TRRx9++OGFCxemp6enp6fPnz9//vz5aQiCIAjKhi5cuPDhSvtm9AAAAcVJREFUhx9+9NFHAsafffZZtVqdnZ29evXq9evXP//889u3b4vEtRvJBirrYBZrzPfv379z545g840bN65duybwfPny5Wq1eunSpZmZmc8+++yzzz779NNPP/30088gCIIgKBuamZm5dOlStVq9fPmygPG1a9du3LgheHznzp379++LtWQjks1UtoF5dXV1ZWVFBM3379+/e/fu7du36/W6xPP8/Pz8/PyVUHNzc3Nzc1cgCIIgKDMSKJQwrtfrt2/fvnv3ruBxo9FYWVlZXV11I5lT2Qjmr776SgTNlM337t27c+fOwsJCvV6v1+u3bt36/PPP/wxBEARB2dPnn39+69YtAcSFhYU7d+7cu3eP8liEyF999ZUbyQYq62DW2by8vLy0tLS0tLS4uLi4uHjv3r179+7dhSAIgqCsSqBQYFEgcnl5WeexG8lmKlMwG9m8uroq8CwILdRoNJYgCIIgKHtqNBqShgKOX3zxhchX23hsRLKVyjqbaU5b4FlIQBqCIAiCIIFhIYFLHcY2HrensjFuFnoYag2CIAiCoFCSj5KYMXkcl8oOSFNOQxAEQRDE9NcO1TGV23IagiAIgiChTpH6/wFtvQ8vf4hDcQAAAABJRU5ErkJggg==" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-2&amp;nbsp; 为 Index 页面增加搜索框&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为 Index 页面增加过滤功能，需要增加一个文本框和一个提交按钮，然后，对 Index 方法进行一些修改，文本框允许你输入一个搜索字符串，用来在 FirstName 和 LastName 中进行搜索。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-2-1&amp;nbsp; 为 Index 方法增加过滤功能&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开&lt;em&gt; Controllers\StudentController.cs &lt;/em&gt;文件，使用下面的代码替换 Index 方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Index(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sortOrder, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; searchString)&lt;br /&gt;{&lt;br /&gt;    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;    ViewBag.DateSortParm = sortOrder == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; db.Students&lt;br /&gt;                   &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; s;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(searchString))&lt;br /&gt;    {&lt;br /&gt;        students = students.Where(s =&amp;gt; s.LastName.ToUpper().Contains(searchString.ToUpper())&lt;br /&gt;                               || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (sortOrder)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;            students = students.OrderByDescending(s =&amp;gt; s.LastName);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;            students = students.OrderBy(s =&amp;gt; s.EnrollmentDate);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;            students = students.OrderByDescending(s =&amp;gt; s.EnrollmentDate);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;            students = students.OrderBy(s =&amp;gt; s.LastName);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(students.ToList());&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;现在，为 Index 方法增加了一个参数 searchString ，LINQ 语句中也增加了一个 where 子句，用来选择在 FirstName 或者 LastName 中包含过滤字符串的学生。搜索串来自文本框的输入，后面需要你在视图中加入它。增加的 where 条件子句仅仅在提供了搜索串的情况下才会被处理。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(searchString))&lt;br /&gt;{&lt;br /&gt;    students = students.Where(s =&amp;gt; s.LastName.ToUpper().Contains(searchString.ToUpper())&lt;br /&gt;                           || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;注意：在传递一个空串的时候，.NET 实现的 Contains 方法将会返回所有的数据行，但是 EF Provider for SQL Server Compact 4.0 对于空串不返回任何行。因此，代码中增加了一个 if 判断语句，以确保对于所有的 SQL Server 都有一致的处理结果。另外，.NET 实现的 Contains 默认进行区分大小写的字符串比较，因此，通过调用 ToUpper 方法显式转换字符串为大写，&lt;/p&gt;&lt;p&gt;以确保在转换到使用资源库模式的时候不需要修改代码。那个时候将会返回一个 IEnumerable 集合而不是 IQueryable 对象 ( 在调用 IEnumerable 集合上的 Contains 方法的时候，使用 .NET 实现的方法，在调用 IQueryable 对象上的 Contains 方法的时候，使用数据库 Provider 提供的实现 )。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-2-2&amp;nbsp; 在 Student 视图上加入搜索框&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在视图 &lt;em&gt;Views\Student\Index.cshtml&lt;/em&gt; 上，table 开始标记之前，增加一个标题，一个文本框，以及一个 Search 按钮。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@using (Html.BeginForm())&lt;br /&gt;{&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        Find by name: @Html.TextBox(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SearchString&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)  &lt;br /&gt;        &amp;lt;input type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;submit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; value=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Search&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;运行程序，输入一个搜索串，然后点击 Search 按钮来查看过滤的效果。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577694/Windows-Live-Writer_23721db860e2_B5FA_Students_Index_page_with_search_box_1.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-3&amp;nbsp; 在 Student 的 Index 视图上增加分页&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了支持分页，你需要通过 NuGet 包管理器安装 &lt;strong&gt;PagedList&lt;/strong&gt; ，然后，需要在 Index 方法中增加一些代码，在视图中增加分页的链接，下面的截图展示了分页的链接。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577700/Windows-Live-Writer_23721db860e2_B5FA_Students_index_page_with_paging.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-3-1&amp;nbsp; 安装 PagedList 包&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NuGet 中的 PagedList 包将会增加一种类型：PagedList，当将查询结果传入到 PagedList 中后，它提供的一系列属性和方法使得排序更加简单。&lt;/p&gt;&lt;p&gt;在 Visual Studio 中，确信选中了当前的项目，而不是解决方案。在 Tools 菜单中，选择 Library Package Manager，然后选择 Add Library Package Reference。&lt;/p&gt;&lt;p&gt;在 Add Library Package Reference 对话框中，点击左边的 Online 窗格，然后在搜索框中输入 pagedlist ，在看到 PagedList 包之后，点击 Install。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577706/Windows-Live-Writer_23721db860e2_B5FA_PagedList_in_Add_Library_Package_Reference_box_bd275609-aca4-4d45-b735-241259001067.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-3-2&amp;nbsp; 为 Index 方法增加分页功能&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Controllers\StudentController.cs&lt;/em&gt;，在代码的前面为 PagedList 命名空间增加 using 语句.&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; PagedList;&lt;/div&gt;&lt;p&gt;将 Index 方法替换成如下的代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Index(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sortOrder, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; currentFilter, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; searchString, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;? page)&lt;br /&gt;        {&lt;br /&gt;            ViewBag.CurrentSort = sortOrder;&lt;br /&gt;            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;            ViewBag.DateSortParm = sortOrder == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ? &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; : &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Request.HttpMethod == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                searchString = currentFilter;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                page = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;            ViewBag.CurrentFilter = searchString;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; students = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; db.Students&lt;br /&gt;                           &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; s;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(searchString))&lt;br /&gt;            {&lt;br /&gt;                students = students.Where(s =&amp;gt; s.LastName.ToUpper().Contains(searchString.ToUpper())&lt;br /&gt;                                       || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (sortOrder)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;                    students = students.OrderByDescending(s =&amp;gt; s.LastName);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;                    students = students.OrderBy(s =&amp;gt; s.EnrollmentDate);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Date desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;                    students = students.OrderByDescending(s =&amp;gt; s.EnrollmentDate);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;                    students = students.OrderBy(s =&amp;gt; s.LastName);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageSize = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageNumber = (page ?? &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(students.ToPagedList(pageNumber, pageSize));&lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;方法又增加了一个 &lt;strong&gt;page&lt;/strong&gt; 参数，方法的签名如下所示。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Index(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sortOrder, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; currentFilter, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; searchString, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;? page)&lt;/div&gt;&lt;p&gt;当第一次显式这个页面的时候，或者用户没有点击分页链接的时候，page 参数将会是 null。如果分页链接被点击了，page 参数将会包含需要显示的页码。&lt;/p&gt;&lt;p&gt;ViewBag 中的 CurrentSort 属性用来提供当前的排序顺序，它必须被包含到当前的分页链接中，以便在分页处理过程中保持当前的排序规则。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;ViewBag.CurrentSort = sortOrder;&lt;/div&gt;&lt;p&gt;其它的 ViewBag 属性为视图提供当前的过滤串，因为这个过滤串在页面被重新显示的时候，必须重新回到文本框中，另外，这个串也必须包含在分页链接中，以便在分页过程中，保持过滤效果。最后，如果在分页的过程中修改了过滤串，那么页码将会回到第一页，因为新的过滤规则返回了不同的数据，很可能原来的页码在这时候已经不再存在了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Request.HttpMethod == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    searchString = currentFilter;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    page = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;ViewBag.CurrentFilter = searchString;&lt;/div&gt;&lt;p&gt;在方法的最后，查询学生的表达式被转换为 PagedList ，而不再是通常的 List，这样传递到视图中的就是支持分页的集合，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageSize = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageNumber = (page ?? &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(students.ToPagedList(pageNumber, pageSize));&lt;/div&gt;&lt;p&gt;ToPagedList 方法需要一个页码值，两个问号用来为可空的页码提供一个默认值，表达式 ( page ?? 1 ) 意味着如果 page 有值得话返回这个值，如果是 null 的话，返回 1。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-3-3&amp;nbsp; 为视图增加分页链接&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;em&gt;Views\Student\Index.cshtml&lt;/em&gt;中，使用下面的代码替换原有代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@model PagedList.IPagedList&amp;lt;ContosoUniversity.Models.Student&amp;gt;&lt;br /&gt;&lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Students&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Students&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create New&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Create&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;@using (Html.BeginForm())&lt;br /&gt;{&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        Find by name: @Html.TextBox(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SearchString&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ViewBag.CurrentFilter &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;)  &lt;br /&gt;        &amp;lt;input type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;submit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; value=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Search&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;}&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })&lt;br /&gt;    &amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&lt;br /&gt;        First Name&lt;br /&gt;    &amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Enrollment Date&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })&lt;br /&gt;    &amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;@foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model) {&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Edit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Edit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id=item.StudentID }) |&lt;br /&gt;            @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id=item.StudentID }) |&lt;br /&gt;            @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id=item.StudentID })&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @Html.DisplayFor(modelItem =&amp;gt; item.LastName)&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @Html.DisplayFor(modelItem =&amp;gt; item.FirstMidName)&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @Html.DisplayFor(modelItem =&amp;gt; item.EnrollmentDate)&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;    Page @(Model.PageCount &amp;lt; Model.PageNumber ? &lt;span style="color: #800080;"&gt;0&lt;/span&gt; : Model.PageNumber)&lt;br /&gt;    of @Model.PageCount&lt;br /&gt;     &lt;br /&gt;    @if (Model.HasPreviousPage)&lt;br /&gt;    {&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { page = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })&lt;br /&gt;        @Html.Raw(&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt; Prev&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { page = Model.PageNumber - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        @:&amp;lt;&amp;lt;&lt;br /&gt;        @Html.Raw(&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        @:&amp;lt; Prev&lt;br /&gt;    }&lt;br /&gt;     &lt;br /&gt;    @if (Model.HasNextPage)&lt;br /&gt;    {&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Next &amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { page = Model.PageNumber + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })&lt;br /&gt;        @Html.Raw(&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        @:Next &amp;gt;&lt;br /&gt;        @Html.Raw(&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;        @:&amp;gt;&amp;gt;&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;视图最前面的 @model 语句指定现在传递到视图的不再是 List 而是 PagedList 。&lt;/p&gt;&lt;p&gt;文本框使用当前的搜索串进行初始化，以便在分页的时候不会丢失搜索串。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; Find by name: @Html.TextBox(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SearchString&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ViewBag.CurrentFilter &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;)  &lt;/div&gt;&lt;p&gt;列的标题链接使用查询串来传递当前的搜索串，以便传递给控制器当前的搜索和排序。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })&lt;/div&gt;&lt;p&gt;在当前页面的最后，通过一行来显示分页的导航 UI。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Page &lt;em&gt;[current page number]&lt;/em&gt; of &lt;em&gt;[total number of pages]&lt;/em&gt; &amp;lt;&amp;lt; &amp;lt; Prev Next &amp;gt; &amp;gt;&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;&amp;lt; 符号连接到第一页， &amp;lt; Prev 链接到上一页，等等。如果用户当前就在第一页，那么，链接到第一页的链接就会被禁用，类似地，如果用户当前在最后一页，导航到最后一页就会被禁用，每一个分页链接传递页码以及当前的排序串和搜索串到控制器，这使得可以在分页的同时维护排序和过滤规则。&lt;/p&gt;&lt;p&gt;如果没有页可以显示，将会显示 &amp;ldquo;Page 0 of 0 &amp;ldquo;，在这种情况下，页面数字就会大于页数，因为 Model.PageNumber 是 1，但是 Model.PageCount 为 0。&lt;/p&gt;&lt;p&gt;运行页面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577712/Windows-Live-Writer_23721db860e2_B5FA_Students_index_page_with_paging_3.png" alt="" width="647" height="651" /&gt;&lt;/p&gt;&lt;p&gt;在不同的排序规则下，点击分页链接，确认分页在正常工作。然后输入一个过滤串，再次点击分页的链接，确认在排序和过滤的同时，分页可以正常工作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-4&amp;nbsp; 创建 About 页面显示学生的统计情况&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 Contoso 大学网站的 About 页面，我们希望能够显示每个注册日有多少学生注册。这需要进行分组，然后在每个组上进行简单地计算，需要完成下列工作：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;创建用于传递数据到视图的 ViewModel&lt;/li&gt;&lt;li&gt;修改 Home 控制器中的 About 方法&lt;/li&gt;&lt;li&gt;修改 About 视图&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3-4-1&amp;nbsp; 创建 ViewModel&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;创建 ViewModels 文件夹，在文件夹中，创建 &lt;em&gt;EnrollmentDateGroup.cs &lt;/em&gt;类文件，将代码替换为如下代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; ContosoUniversity.ViewModels&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; EnrollmentDateGroup&lt;br /&gt;    {&lt;br /&gt;        [DisplayFormat(DataFormatString = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DateTime? EnrollmentDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; StudentCount { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3-4-2&amp;nbsp; 修改 Home 控制器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;增加如下的 using 语句。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; ContosoUniversity.DAL;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; ContosoUniversity.Models;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; ContosoUniversity.ViewModels;&lt;/div&gt;&lt;p&gt;增加一个数据库上下文变量。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; SchoolContext db = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SchoolContext();&lt;/div&gt;&lt;p&gt;使用如下的代码替换 About 方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult About()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; data = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; student &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; db.Students&lt;br /&gt;               group student by student.EnrollmentDate into dateGroup&lt;br /&gt;               &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EnrollmentDateGroup()&lt;br /&gt;               {&lt;br /&gt;                   EnrollmentDate = dateGroup.Key,&lt;br /&gt;                   StudentCount = dateGroup.Count()&lt;br /&gt;               };&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(data);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;LINQ 语句通过注册日期对学生进行分组，计算每一组中的实体数量，最后将查询结果保存为 &lt;code&gt;&lt;strong&gt;EnrollmentDateGroup &lt;/strong&gt;&lt;/code&gt;对象。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3-4-3&amp;nbsp; 增加 Dispose 方法&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;{&lt;br /&gt;    db.Dispose();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.Dispose(disposing);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3-4-4&amp;nbsp; 修改 About 视图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;em&gt;Views\Home\About.cshtml&lt;/em&gt; ，替换为如下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;@model IEnumerable&amp;lt;ContosoUniversity.ViewModels.EnrollmentDateGroup&amp;gt;&lt;br /&gt;           &lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Student Body Statistics&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Student Body Statistics&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;th&amp;gt;&lt;br /&gt;            Enrollment Date&lt;br /&gt;        &amp;lt;/th&amp;gt;&lt;br /&gt;        &amp;lt;th&amp;gt;&lt;br /&gt;            Students&lt;br /&gt;        &amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;@foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model) {&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @String.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:d}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, item.EnrollmentDate)&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @item.StudentCount&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;&lt;p&gt;运行页面，每个注册日注册学生的数量显示在表格中。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577718/Windows-Live-Writer_23721db860e2_B5FA_About_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;现在，你已经看到了如何创建数据模型，以及实现基本的增、删、改、查处理，排序、过滤、分页和分组功能。下一次，我们将会扩展数据模型开始更加高级的内容。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2438156.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/08/2438156.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/04/07/2435203.html</id><title type="text">Contoso 大学 - 2 – 实现基本的增删改查</title><summary type="text">在上一个课程中，你已经创建了 MVC 应用，使用 EF 和 SQL Server Compact 保存和显示数据。在这个课程中，你将要复习并定制 MVC 脚手架为你的控制器和视图自动创建的 CRUD （创建、读取、更新和删除）代码。注意：为了在你的控制器和数据访问层之间进行抽象，通常的做法是实现仓储模式。为了保持这个课程的简洁，在这个系列的最后课程之前，我们不会实现仓储模式。</summary><published>2012-04-07T09:11:00Z</published><updated>2012-04-07T09:11:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/04/07/2435203.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/04/07/2435203.html"/><content type="html">&lt;p&gt;目录&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/haogj/archive/2012/04/04/2431924.html"&gt;Contoso 大学 - 使用 EF Code First 创建 MVC 应用&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a title="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application" target="_blank"&gt;http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在上一个课程中，你已经创建了 MVC 应用，使用 EF 和 SQL Server Compact 保存和显示数据。在这个课程中，你将要复习并定制 MVC 脚手架为你的控制器和视图自动创建的 CRUD （创建、读取、更新和删除）代码。注意：为了在你的控制器和数据访问层之间进行抽象，通常的做法是实现仓储模式。为了保持这个课程的简洁，在这个系列的最后课程之前，我们不会实现仓储模式。&lt;/p&gt;&lt;p&gt;在这个课程中，你将要创建如下的页面。&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577616/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Details_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577622/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Edit_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577628/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Create_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577634/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_delete_page.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2-1 创建详细页&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;脚手架创建的代码遗留下了学生注册属性没有处理，因为这个属性是集合属性。在详细页面中，你将要在 HTML 表格中显示这个集合的内容。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;在 &lt;em&gt;Controllers\StudentController.cs &lt;/em&gt;中，详细页面的 Action 方法类似如下的代码：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ViewResult Details(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;{&lt;br /&gt;    Student student = db.Students.Find(id);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(student);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;代码使用 Find 方法来获取单个的 Student 实体，使用传递给方法的 id 关键字。Id 来自 Index 页面中的超级链接提供的查询字符串。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;打开&lt;em&gt; Views\Student\Details.cshtml&lt;/em&gt;。每个字段使用 DisplayFor 助手方法进行显示，类似如下所示：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;display-label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;LastName&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;display-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @Html.DisplayFor(model =&amp;gt; model.LastName)&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;为了显示注册课程列表，在注册日期 &lt;code&gt;EnrollmentDate &lt;/code&gt;&lt;code&gt;字段之后，fieldset 结束标记之前，增加如下的代码。&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;display-label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @Html.LabelFor(model =&amp;gt; model.Enrollments)&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;display-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;table&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Course Title&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Grade&amp;lt;/th&amp;gt;&lt;br /&gt;        &amp;lt;/tr&amp;gt;&lt;br /&gt;        @foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model.Enrollments)&lt;br /&gt;        {&lt;br /&gt;            &amp;lt;tr&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    @Html.DisplayFor(modelItem =&amp;gt; item.Course.Title)&lt;br /&gt;                &amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    @Html.DisplayFor(modelItem =&amp;gt; item.Grade)&lt;br /&gt;                &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;代码遍历导航属性 &lt;code&gt;Enrollments &lt;/code&gt;&lt;code&gt;中所有的实体，对于这个属性中的每一个 Enrollment 实体，将显示其中的课程和年级。课程标题通过 &lt;strong&gt;Enrollments&lt;/strong&gt;&lt;/code&gt; &lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;code&gt;导航属性保存的 &lt;strong&gt;Course&lt;/strong&gt;&lt;/code&gt; &lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;code&gt;实体来获得。在需要的时候，所有的数据从数据库中获取。( 从另外一个角度说，在这里使用了延迟加载，你没有为 Courses 导航属性指定饿汉模式加载，所以，在你第一次试图访问这个属性的时候，将会向数据库发出一次查询来获取数据，你可以在这个系列后面的 读取相关数据 部分获取更加详细的说明 )&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;code&gt;运行这个页面，选择 &lt;strong&gt;Students&lt;/strong&gt; 选项卡，然后点击 &lt;strong&gt;Details&lt;/strong&gt; 超级链接，你就可以看到课程的列表。&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577640/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Details_page_1.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2-2 建立创建页面&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt; &lt;em&gt;&lt;span style="font-family: 'Calibri','sans-serif';" lang="EN-US"&gt;Controllers\StudentController.cs&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;/em&gt;&lt;span style="font-family: 宋体;"&gt;使用下面的代码替换&lt;/span&gt;&lt;code&gt;&lt;span lang="EN-US"&gt;HttpPost&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span lang="EN-US"&gt;Create &lt;/span&gt;&lt;/code&gt;&lt;code&gt;这个&lt;span lang="EN-US"&gt; Action &lt;/span&gt;方法，为脚手架创建的代码增加 &lt;strong&gt;&lt;span lang="EN-US"&gt;try-catch &lt;/span&gt;&lt;/strong&gt;块。&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[HttpPost]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Create(Student student)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ModelState.IsValid)&lt;br /&gt;        {&lt;br /&gt;            db.Students.Add(student);&lt;br /&gt;            db.SaveChanges();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (DataException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt; ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    } &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(student);&lt;br /&gt;}&lt;/div&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;这些代码将通过&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ASP.NET MVC &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;模型绑定创建的实体对象加入到&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Students &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;集合中，然后保存修改到数据库中。&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;( &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;模型绑定是&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ASP.NET MVC &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的一个功能用于简化你获取通过表单提交的数据，模型绑定转换提交的表单数据到&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; .NET &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;中的数据类型，通过&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Action &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法的参数传递进来，在这里，模型绑定通过表单数据为你实例化了一个&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Student &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的实体对象实例&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; )&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 15px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;这里的&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; try-catch &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;块是这些代码区别于脚手架创建的代码的唯一不同之处，在保存数据的时候，如果派生自&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;DataException &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的异常被抛出，错误信息将会被显示出来，这类错误典型的是由于一些内部错误，而不是程序错误，所以建议用户再重新试一次。在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;span lang="EN-US"&gt;Views\Student\Create.cshtml &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;中的代码与&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Details.cshtml &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;中类似，除了将每个字段的&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; DisplayFor &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;代替为&lt;/span&gt;&lt;code&gt;&lt;span lang="EN-US"&gt;EditorFor &lt;/span&gt;&lt;/code&gt;&lt;code&gt;和 &lt;span lang="EN-US"&gt;ValidationMessageFor &lt;/span&gt;助手方法&lt;span lang="EN-US"&gt;.&lt;/span&gt;下面的示例演示了相关的代码。&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @Html.LabelFor(model =&amp;gt; model.LastName)&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @Html.EditorFor(model =&amp;gt; model.LastName)&lt;br /&gt;    @Html.ValidationMessageFor(model =&amp;gt; model.LastName)&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;在&lt;/span&gt;&lt;em&gt;&lt;span style="font-family: 'Calibri','sans-serif';"&gt; &lt;span lang="EN-US"&gt;Create.cshtml&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;span lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中不需要进行修改。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;重新运行页面，选择&lt;/span&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Students&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 宋体;"&gt;选项卡，点击&lt;/span&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Create New&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577646/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Create_page_1.png" alt="" /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;默认会进行数据验证，输入名字和一个错误的日期，然后点击&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Create&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，查看一下错误提示。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577652/Windows-Live-Writer_0b3cfafc47ec_B5A4_Students_Create_page_error_message.png" alt="" /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;现在，你会看到通过&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; JavaScript &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实现的客户端验证，但是，服务器端的验证也已经实现了。即使客户端验证失败了，坏的数据也会被捕获到，在服务器端会抛出一个异常。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;将日期修改为一个正确的日期，例如：&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;9/1/2005&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，然后点击&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Create&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，会看到一个新的学生出现在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Index&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;页面上。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577658/Windows-Live-Writer_0b3cfafc47ec_B5A4_Students_Index_page_with_new_student.png" alt="" width="649" height="749" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: major-fareast; mso-hansi-font-family: Cambria; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: major-bidi;"&gt;2-3 创建一个编辑页面&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;span lang="EN-US"&gt;Controllers\StudentController.cs &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;中，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;Http Edit &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ( &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;其中没有使用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;HttpPost&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;标签的那一个&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ) &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;使用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Find &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法来获取选中的学生实体，像你在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Details &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法中看到的一样，不需要修改这个方法。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实际上，需要修改&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; HttpPost Edit &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法，使用下面的代码为它增加&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;try-catch&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;处理。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[HttpPost]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Edit(Student student)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ModelState.IsValid)&lt;br /&gt;        {&lt;br /&gt;            db.Entry(student).State = EntityState.Modified;&lt;br /&gt;            db.SaveChanges();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (DataException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt; ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    } &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(student);&lt;br /&gt;}&lt;/div&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;这段代码非常类似在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Create &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;中的代码，实际上，除了将通过模型绑定创建的对象添加到实体集中，这段代码还设置了实体的标志来表示这个实体已经被修改过了。当&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;SaveChanges&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法被调用的时候，数据库中行的所有字段都将会更新。包括用户没有修改过的字段，并发冲突被忽略掉&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ( &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;你将会在这个系列的后面学习如何处理并发问题&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; )&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: major-fareast; mso-hansi-font-family: Cambria; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: major-bidi;"&gt;实体的状态，连接以及&lt;/span&gt;&lt;span style="font-family: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: major-bidi;" lang="EN-US"&gt; SaveChanges &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: major-fareast; mso-hansi-font-family: Cambria; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: major-bidi;"&gt;方法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;数据库上下文对象维护内存中的对象与数据库中数据行之间的同步。这些信息在调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;SaveChanges&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法被调用的时候使用。例如，当使用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Add &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法传递一个新的实体对象时，实体的状态被设置为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Added&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，在调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;SaveChanges&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法的时候，数据库上下文使用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; SQL &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;命令&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;Insert&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;来插入数据。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: 宋体; font-size: 15px; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实体的状态可能为如下之一：&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: Wingdings; font-style: normal; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-style: italic;" lang="EN-US"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="line-height: normal; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;Added&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实体在数据库中不存在。&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;SaveChanges &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法必须执行&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Insert &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;命令&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: Wingdings; font-style: normal; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-style: italic;" lang="EN-US"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="line-height: normal; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;Unchanged&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;在调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;strong&gt;&lt;span lang="EN-US"&gt;SaveChanges &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的时候不需要做任何事情，当从数据库读取数据的时候，实体处于此状态。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 21pt; text-indent: -21pt;"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;" lang="EN-US"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="line-height: normal; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;Modified&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;某些或者全部的实体属性被修改过&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;. &lt;strong&gt;SaveChanges&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;方法需要执行&lt;/span&gt;&lt;span lang="EN-US"&gt; Update &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;命令。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: Wingdings; font-style: normal; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-style: italic;" lang="EN-US"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="line-height: normal; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span lang="EN-US"&gt;Deleted&lt;/span&gt;&lt;/strong&gt;&lt;span lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;实体标记为已删除，&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;SaveChanges &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法必须执行&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Delete &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;命令。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: Wingdings; font-style: normal; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-style: italic;" lang="EN-US"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;span style="line-height: normal; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;Detached&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实体的状态没有被数据库上下文管理。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;在桌面应用中，实体的状态改变典型地自动完成。在这种类型的应用中，你读取一个实体，然后修改某些属性的值，这使得实体的状态被自动修改为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Modified&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;。然后，在调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; SaveChanged &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的时候，实体框架生成&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Update &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;命令进行更新，只有你修改的实际属性被更新。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;但是，在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Web &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;应用程序中，这个处理序列不是连续的。因为数据库上下文读取的实体对象实例在页面被呈现之后被丢弃了。当&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; HttpPost Edit &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法被调用的时候，导致一个新的请求和一个新的数据库上下文对象被生成，所以，你必须手工设置实体的状态为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Modified&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;。然后调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; SaveChanges &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法，实体框架更新数据库中数据行的所有列，因为数据库上下文没有办法知道你修改了哪些属性。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;如果你希望&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Update &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;语句仅仅更新你实际上修改的字段。你可以通过某种途径保存原有的数据值&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ( &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;例如通过隐藏域&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; )&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，以便在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; HttpPost Edit &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法被调用的时候这些值存在。然后，可以使用原始的数据来创建一个&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Student &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实体，使用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Attach &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法调用连接含有原始值的实体对象，然后，使用新的值来更新实体对象，最后再调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; SaveChanges &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法，更多的详细内容，可以查看&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; EF &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;团队的博客：&lt;/span&gt; &lt;span lang="EN-US"&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx"&gt;Add/Attach and Entity States&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/02/01/using-dbcontext-in-ef-feature-ctp5-part-7-local-data.aspx"&gt;Local Data&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;在&lt;/span&gt; &lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;Views\Student\Edit.cshtml&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;中的代码类似于&lt;/span&gt;&lt;span lang="EN-US"&gt; Create.cshtml &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，不需要修改。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-bidi-font-size: 11.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;运行页面，选择&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-bidi-font-size: 11.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US"&gt; Students &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-bidi-font-size: 11.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;选项卡，然后点击&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-bidi-font-size: 11.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US"&gt; Edit &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-bidi-font-size: 11.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;超级链接。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577664/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Edit_page_1.png" alt="" /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;修改一些数据，然后点击&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Save&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，可以在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Index &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;页面看到修改后的数据。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577670/Windows-Live-Writer_0b3cfafc47ec_B5A4_Students_Index_page_after_edit.png" alt="" width="647" height="762" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-family: 'Cambria','serif'; font-style: normal;" lang="EN-US"&gt;2-4&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: major-fareast; mso-hansi-font-family: Cambria; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: major-bidi;"&gt;创建删除页面&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;em&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-family: 'Calibri','sans-serif';"&gt; &lt;span lang="EN-US"&gt;Controllers\StudentController.cs&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;模板生成的&lt;/span&gt;&lt;span lang="EN-US"&gt; HttpGet Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法使用&lt;/span&gt;&lt;span lang="EN-US"&gt; Find &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法来获取&lt;/span&gt;&lt;span lang="EN-US"&gt; Student &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;实体，像在&lt;/span&gt;&lt;span lang="EN-US"&gt;Details &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt; Edit &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法中一样。实际上，为了实现在调用&lt;/span&gt;&lt;span lang="EN-US"&gt; SaveChanges &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法失败的时候使用的错误页面，你需要为这个方法和相应的视图增加一些功能。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;像在更新和创建操作中一样，删除操作也需要两个方法。&lt;/span&gt;&lt;span lang="EN-US"&gt;GET &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法用于显示一个视图，使用户可以允许或者取消删除操作，如果用户允许删除操作，那么，将会发出一个&lt;/span&gt;&lt;span lang="EN-US"&gt; Post &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;请求，&lt;/span&gt;&lt;span lang="EN-US"&gt;HttpPost Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法将会被调用，然后执行实际的删除操作。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;你需要为&lt;/span&gt;&lt;span lang="EN-US"&gt; HttpPost Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法增加一个&lt;/span&gt;&lt;span lang="EN-US"&gt; try-catch &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;块来捕获数据库更新过程中的任何异常。如果错误出现，&lt;/span&gt;&lt;span lang="EN-US"&gt;HttpPost Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法调用&lt;/span&gt;&lt;span lang="EN-US"&gt; HttpGet Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法，传递一个参数表示错误发生了。&lt;/span&gt;&lt;span lang="EN-US"&gt;HttpGet Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法就会根据错误信息重新显示确认页面，使用户可以取消或者重试。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;使用下面的代码替换&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif';" lang="EN-US"&gt; HttpGet Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法中的代码，这里会管理错误报告。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Delete(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id, &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;? saveChangesError)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (saveChangesError.GetValueOrDefault())&lt;br /&gt;    {&lt;br /&gt;        ViewBag.ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unable to save changes. Try again, and if the problem persists see your system administrator.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(db.Students.Find(id));&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;这段代码接收一个可选的&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; bool &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;类型参数，这个参数用来表示是在更新失败之后调用这个方法。在页面请求中被调用的时候，这个参数为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; null ( false )&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，当通过&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; HttpPost Delete &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法更新数据库失败后，被调用的时候，参数被设置为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; true&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，错误信息被传递到视图中。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;将&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; HttpPost Delete &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ( &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;名为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; DeleteConfirmed &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; )&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的代码替换成下面的代码，这将会执行实际的删除操作，并捕获任何数据库更新错误。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[HttpPost, ActionName(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult DeleteConfirmed(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        Student student = db.Students.Find(id);&lt;br /&gt;        db.Students.Remove(student);&lt;br /&gt;        db.SaveChanges();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (DataException)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Log the error (add a variable name after DataException)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Delete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Web.Routing.RouteValueDictionary { &lt;br /&gt;                { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, id }, &lt;br /&gt;                { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;saveChangesError&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; } });&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;这段代码获取选中的实体，然后调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Remove &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法将实体的状态设置为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Deleted&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;。当调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; SaveChanged &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;的时候，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;SQL &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;命令&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Delete &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;被生成并执行。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;如果性能是应用的高优先级目标，你可以省略掉不需要的&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; SQL &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;查询处理，使用下面的代码行调用&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Find &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;和&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Remove &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Student studentToDelete = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student() { StudentID = id };&lt;br /&gt;db.Entry(studentToDelete).State = EntityState.Deleted;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;这段代码实例化了一个&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Student &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;实体，仅仅设置了主键的值，然后将实体的状态设置为&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; Deleted&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;。&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;EF &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;删除实体仅仅需要这些信息。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;需要注意的是，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt;HttpGet Delete &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;方法并不真正删除数据，在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; GET &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;请求处理中进行删除存在着安全风险&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; ( &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;同样在进行编辑，创建，或者任何修改数据的处理中&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; )&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;，更多的资料，参见：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx"&gt;ASP.NET MVC Tip #46 &amp;mdash; Don't use Delete Links because they create Security Holes&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt; &lt;span lang="EN-US"&gt;Views\Student\Delete.cshtml &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;中，在&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; h2 &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;和&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;" lang="EN-US"&gt; h3 &lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi;"&gt;之间增加下面的代码：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;p &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;@ViewBag.ErrorMessage&amp;lt;/p&amp;gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;运行页面，选择&lt;/span&gt;&lt;span lang="EN-US"&gt; Students &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;选项卡，点击&lt;/span&gt;&lt;span lang="EN-US"&gt; Delete &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;超级链接。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i1.asp.net/umbraco-beta-media/2577676/Windows-Live-Writer_0b3cfafc47ec_B5A4_Student_Delete_page.png" alt="" width="647" height="759" /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;点击&lt;/span&gt;&lt;span lang="EN-US"&gt; Delete&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;Index &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;页面中就不会再显示被删除的学生了。&lt;/span&gt;&lt;span lang="EN-US"&gt;( &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;在处理并发的部分可以看到错误处理&lt;/span&gt;&lt;span lang="EN-US"&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span lang="EN-US"&gt;2-5&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;确认数据库连接没有忘记关闭&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;为了确认数据库连接被正确关闭，以及资源被正确释放，你需要释放数据库上下文，这就是为什么在&lt;/span&gt;&lt;span lang="EN-US"&gt; StudentController &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;代码的最后会看到&lt;/span&gt;&lt;span lang="EN-US"&gt; Dispose &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法的原因，在&lt;/span&gt; &lt;em&gt;&lt;span style="font-family: 'Calibri','sans-serif';" lang="EN-US"&gt;StudentController.cs&lt;/span&gt;&lt;/em&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;如下所示：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;{&lt;br /&gt;    db.Dispose();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.Dispose(disposing);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;基类&lt;/span&gt;&lt;span lang="EN-US"&gt; Controller &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;已经实现了接口&lt;/span&gt;&lt;span lang="EN-US"&gt; IDisposable&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，所以这段代码简单地重写了&lt;/span&gt;&lt;span lang="EN-US"&gt; Dispose ( bool ) &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;方法来显式释放上下文对象。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px;"&gt;&lt;span style="font-family: 宋体;"&gt;你现在已经有了一套完整的页面对&lt;/span&gt;&lt;span lang="EN-US"&gt; Student &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;进行增、删、改、查处理。在下一课程中，将会为&lt;/span&gt;&lt;span lang="EN-US"&gt; Index &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;页面增加排序和分页功能。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2435203.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/04/07/2435203.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
