
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
成都达内培训.NET教程开源和跨平台开发对 Microsoft 的当前和将来策略至关重要。
.NET 堆栈的许多构建块已开源,同时开发了其他项来使用和支持新策略。
ASP.NET Core 1.0 目前处于候选发布 (RC) 模式,是适用于针对 Web 和云构建跨平台应用程序的最新开源技术,可在 Linux、Mac OS X 和 Windows 上运行。
ASP.NET Core 使你可利用 C# 编写模型-视图-控制器 (MVC) 应用程序,并依赖于 .NET Core (dotnet.github.io),运行时、库和编译器的新开源和跨平台模块组—同样处于 RC 模式。
ASP.NET Core 的最大优势是完全独立于任何专有项目系统或集成式开发环境,这意味着你也可以在 Microsoft Visual Studio 之外和不同于 Windows 的操作系统上构建 ASP.NET Core 应用程序。
要完成此操作,请使用各种命令行工具来生成基架、构建和运行应用程序,同时可以使用 Visual Studio Code 进行编辑。期间还有许多工作,因此在达到交付厂商版 (RTM) 里程碑之前,一些功能可能会更改。
例如,ASP.NET Core 过去常依赖于 .NET 执行环境 (DNX) 及其命令行界面 (CLI) 来构建和管理应用程序;因为 ASP.NET Core 基于 .NET Core 构建,将来版本中 DNX 将停用且其 CLI 将转换为 .NET Core 命令行工具,因此如果要使用 ASP.NET Core 和 C# 开始编写跨平台 Web 应用,请注意这一点。
本文介绍如何创建跨平台 ASP.NET Core 应用程序以利用 Entity Framework 7 针对数据库执行数据操作,以及如何在 Linux、OS X 和 Windows 上的 Visual Studio Code (#) 中编写代码。
因为重点是数据,所以我建议你阅读官方 Web 网站 (bit.ly/1PhzoC7) 上编写的“.NET Core and Visual Studio Code”(.NET Core 和 Visual Studio Code)。你将根据 DNX 环境编写几个命令以与当前 RC 保持一致;请注意,ASP.NET Core 变为 RTM 后,这将替换为 .NET Core CLI 中的命令。
我将适时指出将被替换的命令。我将使用新的 Visual Studio Code 工具创建我的示例应用程序。
Visual Studio Code 是先进的多语言跨平台开发工具,以编写代码为中心并有挂钩,因此你可以发布构建命令。我假设你已安装 Visual Studio Code、Node.js (#)、SQL Server Express Edition (bit.ly/1PhzoC7) 和 ASP.NET Core 1.0 RC (#/OtherDownloads)。
创建示例数据库
首先,创建要使用的数据库。你可以使用现有数据库,也可以通过 Entity Framework Code First 方法来定义数据模型,但 ASP.NET Core 中的代码迁移支持仍在进行中且此时尚不稳定。
因此,你将简单创建一个新的数据库来存储汽车模型及其制造商名称的列表。
在 SQL Server Management Studio 中,创建名称为“Cars”的新数据库,然后编写和执行如图 1 所示的查询,这会定义名称为“Cars”的表格,此表格具有三列: Id(主键,自动递增)、CarModel(类型为 NVarChar(Max))和 Manufacturer(类型为 NVarChar(Max))。
图 1 创建示例表格
CREATE TABLE [dbo].[Cars](
[id] [int] IDENTITY(1,1) NOT NULL,
[CarModel] [nvarchar](max) NOT NULL,
[Brand] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Cars] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Cars] ON
GO
INSERT [dbo].[Cars] ([id], [CarModel], [Brand]) VALUES (1, N'Mustang', N'Ford')
GO
INSERT [dbo].[Cars] ([id], [CarModel], [Brand]) VALUES (2, N'500', N'Fiat')
GO
INSERT [dbo].[Cars] ([id], [CarModel], [Brand]) VALUES (3, N'Giulia', N'Alfa Romeo')
GO
SET IDENTITY_INSERT [dbo].[Cars] OFF
GO
USE [master]
GO
ALTER DATABASE [CARS] SET READ_WRITE
GO
根据你的情形,可能还想要考虑 bit 类型列,以用于将项目标记为已删除,但实际上不会真正地从数据存储中删除。
确保数据库、表格和示例数据可在 Management Studio 对象资源管理器中正常显示。
为 Visual Studio Code 安装 C#
在 Visual Studio Code 中,C# 语言支持最近移动到了一个你必须单独下载和安装的扩展。强烈建议安装 C# 扩展以获取所有完善的编辑功能,如语法颜色设置、IntelliSense、键入时的代码问题检测等。
为了安装 C#,请运行 Visual Studio Code,打开命令面板 (F1),然后键入“ext install”并按 Enter。从扩展列表中,双击 C# 并等待安装完成。出现提示时,同意重新启动 Visual Studio Code。
构建 ASP.NET Core 应用程序基架
Visual Studio Code 没有内置命令来自动生成 ASP.NET Core 项目,且手动创建项目需要花些力气。
借助 ASP.NET Core 的当前 RC,你可以使用 Yeoman (yeoman.io) 命令行工具(常用基架工具)执行许多操作,并且可用来生成 ASP.NET Core 应用框架。Yeoman 依赖于 Node.js 且必须使用 Node.js 包管理器 (npm) 从命令行进行安装。即,打开命令提示符,键入以下行:
> npm install -g yo generator-aspnet gulp bower
这将在全局位置 (-g) 安装 Yeoman(由“yo”表示)与 gulp(任务自动化工具)和 bower(客户端库管理器)。
请注意,Yeoman 随附许多生成器,包括 ASP.NET 生成器和 Visual Studio Code 扩展生成器。先前命令行中的 generator-aspnet 选项将下载和安装能够简化工作的 ASP.NET Core 生成器。
准备就绪后,使用 cd(或 chdir)命令移动到要在其中创建新应用程序的文件夹 (cd C:\temp)。此时,键入以下命令行:
> yo aspnet
将打开 Yeoman ASP.NET 生成器,如图 2 所示。
图 2 启动 Yeoman 生成器
选择 Web 应用程序模板并按 Enter。在下一屏幕中,输入 CarModels 作为应用程序的名称并按 Enter。生成器根据应用程序名称大小写定义应用程序的根命名空间。
因此,如果 CarModels 是应用程序名称,则根命名空间也将是 CarModels;但如果你输入 carmodels 或 carModels 作为应用的名称,则你的根命名空间将分别是 carmodels 或 carModels。
指定应用程序名称时,请注意这一点。数秒后,Yeoman 在名称为 CarModels 的子文件夹中成功生成一个新的 ASP.NET Core 应用程序。
借助将来的 ASP.NET Core 版本,你也能够使用 .NET Core CLI 构建 Web 应用程序基架。你将使用的命令行如下所示:
> dotnet new
当前版本 CLI 尚不支持构建 Web 应用程序基架;但是会生成一个空的控制台应用程序,因此这是 Yeoman 在此处运行的另一个原因。
通过编写“cd CarModels”然后键入“code”可输入 CarModels,以便启动 Visual Studio Code,并打开当前文件夹及其内容。当 Visual Studio Code 打开文件夹时,它会扫描已知的项目文件名,如 project.json、package.json 或 .sln MSBuild 解决方案文件。
如果是 ASP.NET Core 项目,Visual Studio Code 会查找 project.json,收集依赖关系信息并以适当方式整理代码文件和子文件夹。首次打开项目时,Visual Studio Code 会检测丢失的 NuGet 包并进行还原。
单击信息栏上的“还原”,等待下载 NuGet 包。完成后,可以利用 Visual Studio Code 的所有高级代码编辑功能进行编写和编辑代码文件,并重用大多数 ASP.NET MVC 的现有技能。
实际上,Visual Studio Code 不仅支持 C#,还为撰写 ASP.NET Core 应用程序的所有文件类型提供了语法颜色和其他高级功能,包括 .cshtml、CSS 样式表、JavaScript and .json 文件。
使用 Entity Framework 7 创建数据模型
现在,你已有一个空的 ASP.NET Core 应用程序,下一步是使用 Entity Framework 7(Microsoft 提供的新版常用对象关系映射程序,提供对 ASP.NET Core 的支持)创建数据模型。编写时,Entity Framework 7 处于 RC1。
通过从命令提示符中运行适当的 dnx 命令可完成模型创建,这涉及一组 NuGet 包。第一个 NuGet 包称为 EntityFramework.MicrosoftSqlServer,由新创建的项目自动引用。
第二个 NuGet 包称为 EntityFramework.MicrosoftSqlServer.Design,必须手动添加到项目依赖项。要实现此操作,请在 Visual Studio Code 中打开 project.json 文件,并在依赖关系节点中找到以下行:
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
在此行后,添加以下内容:
"EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",
请注意,两个包必须具有相同的版本号,将来版本中会发生变化。
保存 project.json。Visual Studio Code 将检测丢失的 NuGet 包,并将再次提示包还原。通常,接受此提示。
现在,在包含 ASP.NET Core 项目的文件夹中打开命令提示符。dnx 环境提供 ef 命令,从而你可以从命令行生成实体数据模型。
此命令可提供其他命令,如数据库、dbcontext 和迁移。数据库命令使你可以管理数据库,dbcontext 使你可以构建 DbContext 类型和实体的基架,迁移使你可以进行代码迁移。你将使用 dbcontext 命令生成 DbContext 类和所需实体。
你可以编写 dnx ef to 以查看可用命令列表(参见图 3),或直接键入完整的命令。
图 3 可用 Entity Framework 命令列表
准备就绪后,编写以下命令行:
> dnx ef dbcontext scaffold "Server=.\sqlexpress;Database=Cars;Trusted_Connection=True;"
EntityFramework.MicrosoftSqlServer --outputDir Models
dbcontext 命令具有名称为“基架”的选项,可从所提供连接字符串中指定的数据库中生成适当的 DbContext 和实体。当然,你需要将服务器名称替换成你的。
EntityFramework.MicrosoftSqlServer 指定将用于基架的数据提供程序。
请注意,通过 outputDir 选项为数据模型指定输出目录的方式,区分大小写。在这种情况下,输出目录是名称为 Models 的文件夹,它已存在于项目中,是 DbContext 类和实体的适当逻辑位置。
完成消息显示后,你将看到 Models 文件夹如何包含名称为 CarsContext.cs 的类文件,此文件包含继承自 DbContext 的 CarsContext 类,并包含名称为 Cars.cs 的文件,此文件定义了名称为 Cars 的类并显示数据库中 Cars 表中映射列的属性(参见图 4)。
请注意,无法控制实体名称的多元化,因此应手动管理,但超出本文范围。
图 4 代码编辑器中的汽车模型类
此时,你必须提供应用程序将用于连接到数据库的连接字符串。而不是将连接字符串放入 Web.config 文件,这可在启动类中完成。
这说明了名称为 ConfigureServices 的方法,此方法由运行时调用以通过依赖关系注入 (DI) 配置所需服务,这也是提供连接字符串的建议位置。
ConfigureServices 使用名称为 services、类型为 Microsoft.Extensions.DependencyInjection.IServiceCollection 的参数,它会存储将被注入的服务列表。
考虑以下代码行:
var connection = @"Server=.\sqlexpress;Database=Cars;Trusted_Connection=True;";
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext(options => options.UseSqlServer(connection));
第二行用于为 DI 注册所需的 Entity Framework 和 SQL Server 服务并将 DbContext 类注册为服务。AddDbContext 方法使你可以通过 DbContextBuilder.UseSqlServer 方法(通过名称为 options 的委派调用)指定连接字符串。
两行均必须放在 ConfigureServices 方法的最开始,完整代码如图 5 所示。
图 5 为依赖关系注入注册 DbContext 类
public void ConfigureServices(IServiceCollection services)
{
// Add framework services
var connection = @"Server=.\sqlexpress;Database=Cars;Trusted_Connection=True;";
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext(options => options.UseSqlServer(
connection));
services.AddEntityFramework()
.AddSqlite()
.AddDbContext(options => options.UseSqlite(
Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddMvc();
// Add application services
services.AddTransient();
services.AddTransient();
}
目前,你已实施数据模型。现在,你需要一种方法来显示 UI 将调用的以处理数据的操作。
实施 MVC 控制器
ASP.NET Core 支持 Web API 服务和 MVC 应用程序。
如果你正在构建 RESTful 服务,则 Web API 较适用;而当前示例是具有 UI 的 Web 应用程序,因此你将使用 MVC。你可以实施 MVC 控制器并在任何 ASP.NET MVC 应用程序中查看。
控制器是继承自 Microsoft.AspNet.Mvc.Controller 的类,并显示 UI(或其他客户端)可调用的以处理数据的操作。要添加控制器,请在 Visual Studio Code 中右键单击 Controllers 文件夹并选择“新建文件”。
文本框显示时,输入 CarsController.cs as 作为新文件的名称。这将添加会在代码编辑器中打开的新 C# 文件。新控制器需要实施的方法是让你查询、添加和删除数据的方法。控制器的完整列表如图 6 所示(带注释)。
尽管代码似乎有点长,IntelliSense 将帮助你更加快速高效地编写代码。
图 6 实施处理数据的 MVC 控制器
using System.Linq;
using Microsoft.AspNet.Mvc;
using CarModels.Models;
namespace CarModels.Controllers
{
public class CarsController : Controller
{
// Declares the DbContext class
private CarsContext dataContext;
// The instance of DbContext is passed via dependency injection
public CarsController(CarsContext context)
{
this.dataContext=context;
}
// GET: //
// Return the list of cars to the caller view
public IActionResult Index()
{
return View(this.dataContext.Cars.ToList());
}
public IActionResult Create()
{
return View();
}
// Add a new object via a POST request
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Cars car)
{
// If the data model is in a valid state ...
if (ModelState.IsValid)
{
// ... add the new object to the collection
dataContext.Cars.Add(car);
// Save changes and return to the Index method
dataContext.SaveChanges();
return RedirectToAction("Index");
}
return View(car);
}
[ActionName("Delete")]
public IActionResult Delete(int? id)
{
if (id == null)
{
return HttpNotFound();
}
Cars car = dataContext.Cars.Single(m => m.id == id);
if (car == null)
{
return HttpNotFound();
}
return View(car);
}
// POST: Cars/Delete/5
// Delete an object via a POST request
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public IActionResult DeleteConfirmed(int id)
{
Cars car = dataContext.Cars.SingleOrDefault(m => m.id == id);
// Remove the car from the collection and save changes
dataContext.Cars.Remove(car);
dataContext.SaveChanges();
return RedirectToAction("Index");
}
}
}
总体而言,你有四个操作: Index,向调用方视图返回汽车列表;Create,通过 HTTP POST 请求添加新汽车;Delete 和 DeleteConfirmed,等待用户确认并通过 HTTP POST 请求分别删除汽车。对于 About Index,你也可以编写 LINQ 查询以返回筛选的列表。
添加和设计 MVC 视图
在 MVC 中,视图是撰写应用程序 UI 的数据绑定网页。在本示例中,你需要三个视图:“索引”页面显示汽车列表;“创建”页面让用户添加新汽车;“删除”页面在从数据库删除汽车之前询问确认。
视图必须整理到“Views”文件夹中的子文件夹中,应用程序使用其名称路由 Web 请求。
例如,如果创建名称为“Cars”的文件夹,此文件夹中的所有视图将通过 ApplicationName/Cars 路由惯例打开。
假设你已在“Views”下创建了名称为“Cars”的文件夹,右键单击它并选择“新建文件”。
输入 Index.cshtml 作为文件名并按 Enter,因此新文件会在代码编辑器中立即可用;根据其扩展,Visual Studio Code 将其识别为 Razor 文件。
此视图用于通过表格显示项目的完整列表;每行显示汽车模型、制造商名称和用户可单击以删除项目的超链接。图 7 显示 Index.cshtml 页面的完整代码。
图 7 创建一个索引视图
@model IEnumerable
@{
ViewBag.Title = "Cars";
}
Car models
Add New
Car Model Brand
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.CarModel)
@Html.DisplayFor(modelItem => item.Brand)
asp-route-id="@item.id">Delete
}
请注意,标记如何利用所谓的模型绑定来指定模型类的 .NET 类型并为每行调用和绑定其属性。
此外,还请注意“删除”链接如何指向 Cars 控制器中同名操作,以通过模型绑定提供项目 ID。
同样,名称为“Create”的操作指向 Cars 控制器中的 Create 操作,并打开新的视图以使你添加新的对象。此视图称为“创建”,通过执行先前对“索引”视图执行的步骤可创建一个此视图,即添加 Create.cshtml file into the Views\Cars 子文件夹。
在此新的视图中,你基本上可创建一个数据表单,用户可根据模型属性在此表单中编写信息,提供了一个按钮用来向绑定控制器提交信息。图 8 显示如何完成这个任务。
图 8 定义创建视图
@model CarModels.Models.Cars
@{
ViewBag.Title = "New car";
}
@ViewData["Title"]
class="form-horizontal" role="form">
最后一步是将名称为 Delete.cshtml 的新视图添加到 Views\Cars 子文件夹。添加时,键入如图 9 所示的代码,此图显示了有关将删除项目的详细信息并提供了一个选项来提交或取消更改。
图 9 创建删除视图
@model CarModels.Models.Cars
@{
ViewData["Title"] = "Delete";
}
Delete
Are you sure you? The operation cannot be undone.
Cars
@Html.DisplayNameFor(model => model.Brand)
@Html.DisplayFor(model => model.Brand)
@Html.DisplayNameFor(model => model.CarModel)
@Html.DisplayFor(model => model.CarModel)
|
Back to List
此时,你已有数据模型、操作和 UI。这意味着你准备开始测试示例应用程序。
运行应用程序
可以直接从 Visual Studio Code 运行 ASP.NET Core 应用程序。要完成此操作,请打开命令面板,键入 dnx 并按 Enter。
接下来,选择 dnx: 运行命令并按 Enter。单击 dnx web。这与在命令提示符键入 dnx web 等同。
在将来版本中,你将从命令行编写 dotnet run。此时,Visual Studio Code 启动 Kestrel(这是 ASP.NET Core 应用程序 (bit.ly/1rdEfxV) 的开源 Web 服务器)以托管你的 Web 应用。
在 Visual Studio Code 中,你也会看到控制台窗口,其中 Kestrel 会重定向其输出及运行时发送的所有消息,包括发生异常时的堆栈跟踪,其对调试特别有用。
默认情况下,Kestrel 开始侦听端口 5000,即你可以打开常用浏览器并键入 http://localhost:5000 以启动应用程序。图 10 显示运行的应用程序。
图 10 运行的应用程序
在浏览器的 Web 地址栏中,键入 localhost:5000/Cars 以打开 Cars 控制器的默认视图。如图 11 所示,应用程序按预期显示汽车列表。
图 11 应用程序在数据库中显示汽车列表
单击“新增”,以便可以添加新项目(参见图 12)。单击“创建”时,新项目保存到数据库中,应用程序将导航回先前视图,你将在其中看到更新的汽车列表。
图 12 添加“新建项目”
现在,单击先前添加的汽车旁边的删除超链接。将显示“删除”视图,其中包含所选项目的详细信息并询问用户确认(参见图 13)。
只需单击“删除”即可删除项目并返回到索引。请记住,这是一个跨平台 Web 应用程序,因此可发布到 Linux、OS X 和 Windows。
图 13 删除项目
关于发布应用程序的提示
你还有两个方法可发布 ASP.NET Core 应用程序,包括(但不限于)Microsoft Azure 和 IIS。
第一个方法需要启用 Git 集成,而第二个方法当前涉及 DNX 实用工具 (dnu) 和 dnu 发布命令行且将在将来版本中涉及 dotnet 发布命令行。发布已在 Microsoft 资源中讨论过。
发布到 Azure 在 bit.ly/22QXTh6 中进行了讨论,而 bit.ly/1TWvfWh 中讨论的是使用 dnu。
总结
Visual Studio Code 使你可以通过利用适用于 C# 和项目中其他文件类型的所有改善的编辑功能来编写 ASP.NET Core 应用程序。
它本身作为一个跨平台,是开始编写适用于 Linux、OS X 和 Windows 的 MVC 应用程序的完美小帮手。
不同平台的 Entity Framework 的可用性以及重用现有 C# 和 MVC 技能的机会使编写以数据为中心的 Web 应用程序成为更加令人惊叹的体验。