阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ASP.NET 5系列教程

1,036次阅读
没有评论

共计 30226 个字符,预计需要花费 76 分钟才能阅读完成。

ASP.NET 5 是用于创建 Web 应用的框架,相对于以前的版本它更加简练、灵活,本次发布的版本彻底优化了应用开发框架,你可以轻松部署应用到云端或其他平台,它包含了最小的模块化组件,所以确保你在构建复杂解决方案的同时保持灵活性。

微软已经发布了 ASP.NET 5.0,这次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使 ASP.NET 应用不再受限于 IIS、Cloud-ready 环境配置降低了云端部署的门槛,另外源码开放无疑也是一个重量级惊喜。这些更改会有助于创建易于开发、部署、维护和现代的 Web 应用程序。相信看到以上几点作为.NET 程序员的你已经迫不及待体验 ASP.NET 5 的新功能了,下面我们就来看下这些新特性。

ASP.NET 5 是用于创建 Web 应用的框架,相对于以前的版本它更加简练、灵活,本次发布的版本彻底优化了应用开发框架,你可以轻松部署应用到云端或其他平台,它包含了最小的模块化组件,所以确保你在构建复杂解决方案的同时保持灵活性。

ASP.NET 5 包含以下特性:

·灵活的跨平台运行时

·新的 HTTP 模块请求管道

·Cloud-ready 环境配置

·统一了包含 MVC、Web API 和 Web 页面的编程模型

·无需重新编译即可查看更改效果

·并行的.NET Framework 版本

·自主部署或 IIS 部署能力

·内嵌于 Visual Studio 2015 中的新工具

·GitHub 开放源码

使用旧版本开发的应用程序不需要做任何修改,即可直接在 ASP.NET 5 上运行。然而,如需使用 ASP.NET 5 新功能,你需要将现有代码移植到新的框架。ASP.NET 5 和早期 ASP.NET 版本基本相同,因此你只需要把精力集中到新功能开发上,节省了你的代码迁移时间。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/926aac25ecc6f276f2356f1ac55f4d9b.jpg" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="wKioL1RpVNfDI0KAAABEH_SNKvA927" width="504" height="264">

以上概括性的介绍了 ASP.NET 5 的新特性和增强功能。

-menu-0'>本篇文章中我们将重点阐述以下几点:

  • 为什么重新设计 ASP.NET?

  • 灵活的跨平台运行时需求

  • 灵活的部署环境

  • 多 Framework 版本并行使用

  • 简化依赖关系管理

  • 合并 MVC、Web API 和 Web 页

  • 增强 HTTP 性能

  • Cloud-ready 部署能力

  • 集成依赖注入

  • 开源

  • 提供敏捷的开发环境

  • 关于 Web Forms

  • 早期版本 Framework 开发应用兼容性

-menu-1'>为什么重新设计 ASP.NET?

灵活的跨平台运行时需求

早期 .NET Framework 版本一直作为单一且全面的整体进行安装,每个新版本都包含了新功能和几乎所有早期功能,而鲜有删减,这就不可避免的造成 Framework 的体积的增长。这种模式确保了安装了新版 Framework 的 Windows 系统可以兼容所有早期版本的.NET 应用,但是也意味着每个应用都将运行在一个庞大冗余的框架上,即使很多功能在实际项目中没有使用。

相信每位.NET 程序员都遇到过以下尴尬的决策场景:当收到 Framework 有更新发布时的通知时,是放弃使用新增功能保持应用的灵活性还是使用新特性而忍痛让你的 Framework 更加庞大!

为了应对以上场景。ASP.NET 5 提供了三种运行时,你可以根据实际需要灵活选择:

1. 全功能 .NET CLR
全功能.NET CLR 是 Visual Studio 工程默认运行时状态。它提供所有 API,是保持应用向下兼容性最佳选择。

2. 核心 CLR (cloud-optimized runtime) -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
核心 CLR 是精简的完全模块化运行时。这个 CLR 已经被重新设计成组件便于你仅包含项目中实际使用的的.NET 特性。组件作为 NuGet 包添加。一旦完成引用,你的应用仅依赖于所需的功能。通过分解运行时为组件,我们可以更快的更改每个组件,因为每个组件都有自我更新机制。核心 CLR 只有 11M 大小,相对于 200M 的全功能 CLR 无疑将使应用更加轻便。核心 CLR 可以伴随应用一起部署并且不同的核心 CLR 可以并行运行。

3. 跨平台 CLR -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
微软将发布针对于 Linux 和 Mac OS X 发布跨平台运行时。这意味着你的.NET 应用具备了在 Mac 和 Linux 设备上运行的能力。微软将和 Mono 社区合作完成这一新特性。在发布之前,你可以使用 Mono CLR 用于跨平台开发。

新建 Visual Studio 工程默认使用全功能 .NET CLR,可以在工程属性页面更改为核心 CLR。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/290c81b303ce4c554d2a6819174dec5f.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image001" width="604" height="316">

-menu-2'>灵活的部署能力

ASP.NET 5 允许部署应用到 IIS,或脱离 IIS 进行独立部署,当设置目标 Framework 为 Core CLR 时,即可以使用部署包中的依赖项来部署应用。因此,你的应用自成一体,再不依赖于全功能的.NET 版本。该应用可以在任何设备和平台中运行应用。

这对.NET 平台开发人员无疑又是个惊喜,部署应用不在局限于 IIS,当然微软仍然推荐你使用 IIS 部署应用,但是如果需要在不兼容 IIS 的平台部署应用,你就可以使用该新特性进行操作。

后续文章中我们会发布如何创建不依赖于 IIS 的 MVC6 应用,敬请期待。

多版本 .NET 并行使用

早期版本的.NET Framework,你将时刻面临是否更新版本的选择,一方面你希望使用更新的功能,另一方面你将为旧版本开发的工程是否可以平滑迁移到新版 .NET Framework 而感到纠结。

微软在 ASP.NET 5 中改善了以上问题。在使用核心 CLR 前提下,你可以在部署包内定义依赖关系,所以你可以为每个应用程序指定.NET 版本。旧版应用可以平滑运行,同时你也可以使用新版本开发应用。因此在 ASP.NET 5 中多个版本的.NET 应用是并行的。

-menu-3'>简化依赖关系管理

ASP.NET 5 推出了一种全新的轻量级依赖关系管理机制。你不再需要在应用中添加引用,而是使用引用 NuGet 包代替。你可以通过 NuGet Package 管理器添加 NuGet 包,或者你可以编辑包含 NuGet 包列表和版本信息 JSON 文件 (project.json) 来实现引用。project.json 文件用于列举应用使用的 NuGet 相关信息,如需添加其他引用,直接在该 JSON 文件中添加即可。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/cb710c69536d2c50fe5b2980cc475311.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image002" width="604" height="366">

在 Visual Studio 2015 中,根据智能提示可以快速的添加 NuGet 包。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/804929b940a3f8dcf640d0b99cf59104.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image003" width="604" height="298">

project.json 文件仅包含直接添加到工程中的 NuGet 包。如果添加引用文件外的包,这类依赖项将仅仅被加载,而不会显示到 project.json 文件中。这种机制可以使 project.json 文件轻便易管理。

JSON 格式文件使你可以在没有安装 Visual Studio 情况下,轻松管理引用。当然,可以使用任何文本编辑器打开和编辑 project.json。

-menu-4'>合并 MVC, Web API 和 Web 页

早期版本中,MVC、Web API 和 Web 页一直在使用着不同的方式实现着相同的功能,可以说是殊途同归。例如,MVC 和 Web API 都提供了路由,但是 MVC routing 类在 System.Web.Mvc.Routing 命名空间中,而 Web API 中类似的类在 System.Web.Http.Routing 命名空间中。再举一个例子,Web 页和 MVC 都是有 Razor 语法,但是仍然包含在相同功能的不同 NuGet 包中。

在 ASP.NET 5 中,MVC、Web API 和 and Web 页将被整合到同一框架-MVC 6。这就意味着移除了重复功能模块,使开发应用变得更简单。

在预览版本中,MVC and Web API 首先被合并到 MVC 6 中。Web 页面将后在后续发布版本中添加。

增强 HTTP 性能

ASP.NET 5 提供了一个精炼快速的 HTTP 请求管道,该模块化管道允许你仅添加需要的组件,通过减轻管道开销,应用将有更好的吞吐量。

云部署能力

当你创建一个新的 ASP.NET 5 工程,这个工程默认就已经具备轻松部署到云端的结构。Visual Studio 2015 提供了全新的环境配置系统代替了 Web.config 文件。新的系统允许使用多种文件类型 (例如 JSON, XML, or 或环境变量) 存储键值对,因此你可以在任意环境中轻松指定值或获取这些值。

同时,ASP.NET 5 提供了检测和跟踪已部署云应用问题的工具。

集成依赖注入

依赖注入被内置于 ASP.NET 5 中。你可以使用 IoC 容器注册依赖项。依赖关系的注入促进了正确服务环境的提供。

-menu-5'>开源

ASP.NET 源码已经发布到 GitHub 中。不仅仅提供了当前版本源代码,微软也承诺会同步更新 GitHub 中的源码,你可以及时查看到 ASP.NET 的变化,可以下载并且提交更改到 GitHub 上。

这有助于你了解 ASP.NET 代码及技术走向,同时你可以定制自己的 ASP.NET。

提供敏捷的开发环境

Visual Studio 2015 提供了一个轻量级的 ASP.NET 开发环境。无需重新编译工程,只需要保存更改代码,就可以在浏览器中查看最新结果。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/a116aa513e54e9c5fe5f5b078c0a99ae.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image004" width="604" height="309">

你更改的代码可以在 Web 工程或者由当前 Web 工程中引用的类库中。

Visual Studio 使用 Roslyn 编译器允许动态编译。确保你拥有完整、强大的编译框架的同时,拥有趋近于解释语言的开发体验。

每个 Visual Studio 的用户界面都具有对应的脚本,因此你可以轻松在 UI 界面和脚本之间��换。

最后,可以使用其他代码编辑器编辑 ASP.NET 5 工程。

-menu-6'>关于 Web Forms

微软一直致力于提供给用户新的功能去改善开发体验,你仍旧可以开发 Web Forms 应用,并且在 Web Forms 4.6 添加了以下新特性:

  • HTTP 2

  • 异步绑定模式

  • Roslyn CodeDOM 编译器

早期版本开发的 Web Forms 应用无需任何更改可以直接在 IIS .NET 4.6 框架下运行。不过,无法使用 ASP.NET 5 核心 CLR 新特性。

例如当前有使用 Web Forms、MVC 5、Web API 2、SignalR 2、Web Pages 3 或 Entity Framework 6 开发的应用,你仅需设置当前运行时版本为全功能运行时,无需做出任何代码级别修改即可在 ASP.NET 5 中运行。但是,核心 CRL 是 ASP.NET 5 新特性,如果你希望应用具备该运行时的功能,那么需要做出一定的修改。微软提供 API Portability Analyzer 工具可以判断当前应用是否可以使用核心 CRL。这个工具还可以分析当前应用可以运行在哪些平台,以及哪些因素阻止其不能在特定平台上运行。同时也会提示所需要的更改以及使用哪些新增接口来替换。

MVC 6 和 SignalR 3 应用使用新的 HTTP 管道,所以它们无法与使用 System.Web 接口的应用兼容。如果需要升级已存在应用到 MVC 6 或者 SignalR 3,你必须使用 Visual Studio 2015 创建新工程,再导入原有工程,导入过程中需要修改不支持的代码片段。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-01/127759p2.htm

本篇文章内容比较基础,主要是向大家展示如何创建一个 ASP.NET 5 工程,主要包含内容如下:

  • 创建 ASP.NET 5 工程

  • 添加 Todo 控制器

  • 安装 K Version Manager

  • 执行 EF 迁移

打开 Visual Studio 2015 Preview。选择”File” 菜单,选择New > Project

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/f1bfe10d6d53783f8d5e1ee24f60b71e.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image002" width="557" height="350">

New Project 对话框中,点击Templates > Visual C# > Web,选择ASP.NET Web Application 工程模板。命名工程为 ”TodoList”,点击OK

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/d41ce8c81c9afa108276338769969b8d.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image004" width="557" height="420">

添加 Todo 控制器

1. 下载完整工程 completed project。

2. 在工程解决方案管理器中,右键点击 Controllers 文件夹 > Add > Exiting Item 输入下载工程中的 TodoController.cs 文件路径

3. 使用相同的方法添加 Models\TodoItem.cs Models\TodoItemEditModel.cs 文件到 Models 文件夹。

4. 在 Views 下创建ToDo 文件夹。使用同样方法,添加Views\ToDo 文件夹下所有 View 文件到Views\Todo 文件夹。

5. 更改Views\Shared\_Layout.cshtml 文件下的 ActionLink 调用 Todo 控制器:

-default'><!DOCTYPE-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> html>
<html>
<head>

<meta-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> charset=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> />
<meta-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> name=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> content=>
<title>@ViewBag.Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> --default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Todo</title>

<link-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> rel=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> href=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> />

<link-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> rel=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> href=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> />

</head>

<body>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<button-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> type=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> data-toggle=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> data-target=>

<span-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =></span>

<span-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =></span>

<span-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =></span>

</button>,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> area-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>},-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> @class-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<ul-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>*-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Markup-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> removed-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  brevity-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> *</body>
</html>

6. 添加 DbSet 包含 TodoItem 模型到Models\IdentityModels.cs 文件。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ApplicationDbContext-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IdentityDbContext<ApplicationUser>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _created-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  DbSet<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItems-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}

7. 运行 app 点击 Todo app 链接。你会遇到以下错误信息 (将在后续文章中解决这个问题)。

A database operation failed while processing the request. -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
SqlException: Invalid object name ‘TodoItem’. -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
There are pending model changes for ApplicationDbContext -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
Scaffold a new migration for these changes and apply them to the database from the command line -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
> k ef migration add [migration name] -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
> k ef migration apply

安装 K Version Manager (KVM)

1. 以管理员身份运行 Visual Studio 命令提示工具。

2. 执行以下指令:

@powershell -NoProfile -ExecutionPolicy unrestricted -Command “iex ((new-object net.webclient).DownloadString(‘https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1’))”

以上指令将为当前用户安装 KVM。

3. 退出Visual Studio 命令提示工具,重新使用管理员身份运行 Visual Studio 命令提示工具(你需要使用新的命令提示工具获取已经更新的路径环境)。

4. 使用以下指令升级 KVM:

KVM upgrade -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
现在已经可以运行 EF 迁移了。.

执行 EF 迁移

1. 在管理员命令提示窗体中,更改当前操作路径为工程文件夹,工程文件夹下包含 project.json 文件。

2. 在命令提示窗体中运行以下指令:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

k ef migration add initial -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
k ef migration apply -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
ef migration add initial

指令将以 <date>_<migration name>.cs 命名形式添加一个迁移文件,迁移文件中包含了迁移代码 that adds the TodoItem DbSet. TheMigrations\ApplicationDbContextModelSnapshot.cs 文件 file will be updated to include instructions to create theTodoItem entity.

-default'>builder.Entity(,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> b-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>