第十一章 使用EF Core

第二部分  Entity Framework Core 2的细节
在本书的第2部分中,我将深入讨论细节。我首先探讨实体框架核心支持的基本数据操作,并解释如何管理数据库以及如何处理对象之间的关系。我也演示了不同的方法,让实体框架核心可以与现有的数据库一起使用。
 
 
 
 
第十一章 使用EF Core
在这一章中,我将讲述如何将EF Core应用于ASP.NET Core MVC项目,从添加NuGet包开始,创建基本的数据模型、数据库和使用它的基础设施。本章中创建的项目为后面的项目奠定了基础,这些项目添加了实体框架的核心特性。表11-1总结了这一章。

 

 
11.1 创建ASP.NET Core MVC项目
在本章,我将创建一个包含ASP.NET Core MVC代码尽量少一点的项目。然后,我将添加包、类和配置组件来创建使用了EF Core的MVC应用程序。
为创建工程,在VS菜单栏中选择File->New->Project,使用ASP.NET Core Web Application工程模板,创建一个新工程,起名DataApp,如下图11-1所示

点击OK进入下一个对话框,在最上边确保选中的是ASP.NET Core 2.0然后点击Empty模板,如下图11-2所示。点击OK关闭对话框创建工程。

11.1.1 创建数据模型类
  MVC应用程序中的数据模型使用的是常规的c#类,这些类通常在一个名为Models的文件夹中定义。实体框架核心对数据模型类的位置没有任何特殊要求,它将愉快地使用MVC约定。
    要向示例项目添加数据模型类,请创建Models文件夹并向其添加一个名为Product.cs的C#文件,代码如清单11-1所示。

 

 1 //Listing 11-1. The Contents of the Product.cs File in the Models Folder
 2 namespace DataApp.Models
 3 {
 4     public class Product
 5     {
 6         public string Name { get; set; }
 7         public string Category { get; set; }
 8         public decimal Price { get; set; }
 9     }
10 }

 数据模型类往往只定义一堆自动属性,这使它们易于使用,并确保它们可以用类似JSON这样的格式表现出来,HTTP web服务经常使用这样的JSON格式,如第10章所示。清单11-1中的Product类定义了Name、Category和Price属性,它是第1部分中的SportsStore示例中的数据模型的简化版。在后面的章节中,我将为数据模型添加更多的复杂性,但是这已经足够开始了。

 

11.1.2 配置服务和中间件
Empty模板创建一个基本的ASP.NET Core项目,它需要额外的配置来启用MVC框架。将清单11-2所示的语句添加到Startup类中,以启用对这次开发有用的MVC框架和中间件组件。
 1 //Listing 11-2. Enabling Services and Middleware in the Startup.cs File in the DataApp Folder
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Threading.Tasks;
 6 using Microsoft.AspNetCore.Builder;
 7 using Microsoft.AspNetCore.Hosting;
 8 using Microsoft.AspNetCore.Http;
 9 using Microsoft.Extensions.DependencyInjection;
10 namespace DataApp
11 {
12     public class Startup
13     {
14         public void ConfigureServices(IServiceCollection services)
15         {
16             services.AddMvc();
17         }
18         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
19         {
20             app.UseDeveloperExceptionPage();
21             app.UseStatusCodePages();
22             app.UseStaticFiles();
23             app.UseMvcWithDefaultRoute();
24         }
25     }
26 }

这些启用了开发人员友好的错误消息,添加对静态内容(如HTML和CSS文件)的支持,并使用默认路由配置设置MVC框架。

 
 
11.1.3 添加一个控制器和视图
现在MVC框架已经启用,我可以创建一个控制器和一个视图来处理HTTP请求。创建一个Controllers文件夹,并向其中添加一个名为HomeController.cs的c#类文件。代码如清单11-3所示。
 1 //Listing 11-3. The Content of the HomeController.cs File in the Controllers Folder
 2 using Microsoft.AspNetCore.Mvc;
 3 using DataApp.Models;
 4 namespace DataApp.Controllers
 5 {
 6     public class HomeController : Controller
 7     {
 8         public IActionResult Index()
 9         {
10             return View(new Product[] {
11                     new Product { Name = "P1", Category = "Cat1", Price = 10 },
12                     new Product { Name = "P2", Category = "Cat2", Price = 20 },
13                     new Product { Name = "P3", Category = "Cat3", Price = 30 },
14                  });
15         }
16     }
17 }

  这个控制器中有一个名为Index的操作方法(Action方法),Index方法创建了一个Product对象的集合的占位符,这些Product对象作为视图模型(view model)传递给默认视图。等我数据库和EF Core写好和可以运行时,这些硬编码的对象将在本章后面被替换。

  要为应用程序提供一致的布局,请创建一个名为Views/Shared的文件夹,并添加一个名为_Layout.html的Razor布局页面。内容如清单11-4所示。
 1 Listing 11-4. The Content of the _Layout.cshtml File in the Views/Shared Folder
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5     <meta name="viewport" content="width=device-width" />
 6     <title>@ViewData["Title"]</title>
 7     <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
 8 </head>
 9 <body>
10     <div class="p-2">
11         <h4 class="bg-primary text-center p-2 text-white">@ViewData["Title"]</h4>
12         @RenderBody()
13     </div>
14 </body>
15 </html>

要在Home控制器上为Index操作方法创建视图,请创建Views/Home文件夹并向其添加名为Index.cshtml的Razor视图。内容如清单11-5所示。

 1 Listing 11-5. The Contents of the Index.cshtml File in the Views/Home Folder
 2 @model IEnumerable<Product>
 3 @{
 4     ViewData["Title"] = "Products";
 5     Layout = "_Layout";
 6 }
 7 <table class="table table-sm table-striped">
 8     <thead>
 9         <tr><th>Name</th><th>Category</th><th>Price</th></tr>
10     </thead>
11     <tbody>
12         @foreach (var p in Model)
13         {
14             <tr>
15                 <td>@p.Name</td>
16                 <td>@p.Category</td>
17                 <td>$@p.Price.ToString("F2")</td>
18             </tr>
19         }
20     </tbody>
21 </table>

视图使用从控制器接收的Product对象集合作为视图模型,在HTML table表中生成行,显示Name、Category和Price属性的值。

为了启用标记助手(tag helpers),我在Views文件夹中创建了一个名为_ViewImports.cshtml的视图导入页面。并添加了如清单11-6所示的语句。
Listing 11-6. The Contents of the _ViewImports.cshtml File in the Views Folder
@using DataApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 
11.1.4 添加Bootstrap CSS框架
您在清单11-4中创建的布局文件包含了引入Bootstrap框架中CSS样式表的<link>元素,我在本书中使用它来样式化HTML内容。引导程序添加到项目中,解决方案资源管理器中右键单击DataApp项目,从弹出菜单中选择add➤新项,并使用JSON文件模板(在ASP。网络核心➤Web➤一般类别)来创建一个文件
 
.bowerrc,其内容如清单11-7所示。(注意这个文件名很重要:它以句点开头,包含字母r两次,没有文件扩展名)。
 
 
11.1.5 配置HTTP端口
11.1.6 运行小例子
 
11.2 添加和配置EF Core
11.2.1 添加NuGet包
11.2.2 创建数据库上下文类
11.2.3 准备实体类
11.2.4 修改控制器
11.2.5 配置数据库提供者
11.2.5.1 定义连接字符串
11.2.5.2 配置应用程序
 
11.2.6 配置EF Core日志
11.2.6.1 生成和应用迁移
11.2.6.2 启动小例子
 
11.3 实现仓储模式
11.3.1 定义仓储接口和实现类
11.3.2 避免 IEnumerable vs IQueryable陷阱
11.3.2.1 理解和避免额外查询的问题
11.3.3 隐藏数据操作的细节
 
 
11.4 完成MVC小例子
11.4.1 完成仓储
11.4.2 添加操作Action方法
11.4.3 修改和添加视图
11.5 本章小结
 

 

 

 

posted on 2019-01-14 17:33  困兽斗  阅读(183)  评论(0)    收藏  举报

导航