基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
来个目录吧:
第一章-入门
第二章- Entity Framework Core Nuget包管理
第三章-创建、修改、删除、查询
第四章-排序、过滤、分页、分组
第五章-迁移,EF Core 的codefirst使用
暂时就这么多。后面陆续更新吧
EF Core 的codefirst使用
在本教程中,您将开始使用EF Core迁移功能来管理数据模型更改。在后面的教程中,您将在更改数据模型时添加更多迁移。
迁移简介
开发新应用程序时,数据模型会频繁更改,并且每次模型更改时,它都会与数据库不同步。
您通过配置Entity Framework以创建数据库(如果它不存在)来启动这些教程。
然后每次更改数据模型时,添加,删除或更改实体类或更改DbContext类 - 您可以删除数据库,EF将创建一个与模型匹配的新类,并为其添加测试数据。
这种使数据库与数据模型保持同步的方法运行良好,直到将应用程序部署到生产环境。
当应用程序在生产环境中运行时,它通常存储您想要保留的数据,并且您不希望每次进行更改时丢失所有内容,例如添加新列。
EF Core Migrations功能通过使EF更新数据库模式而不是创建新的数据库来解决这个问题。
更改连接字符串
在appsettings.json文件中,将连接字符串中的数据库名称更改为ContosoUniversity2 ,当然你可以自己取 个你喜欢的名字。
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity2;Trusted_Connection=True;MultipleActiveResultSets=true"
},
注意:
作为更改数据库名称的替代方法,您可以删除数据库。使用SQL Server对象资源管理器(SSOX)或使用database drop CLI命令:
dotnet ef database drop -c SchoolContext
以下部分说明如何使用CLI命令。
初始化迁移
保存您的更改并构建项目。然后打开命令窗口并导航到项目文件夹。这里有一个快速的方法:
在解决方案资源管理器中,右键单击项目,然后从上下文菜单中选择在文件资源管理器中打开。

按住Shift键并右键单击文件资源管理器中的项目文件夹,然后从上下文菜单中选择打开命令窗口。

在输入命令之前,停止站点的IIS Express,或者您可能会收到一条错误消息:“ 无法访问文件... ContosoUniversity.dll,因为它正被另一个进程使用 ”。要停止站点,请找到IIS Express图标,然后右键单击它,然后单击ContosoUniversity停止站点。
停止IIS Express后,在命令窗口中输入以下命令:
dotnet ef migrations add InitialCreate -c SchoolContext
在命令窗口中看到如下输出:
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:15.63
Done. To undo this action, use 'ef migrations remove'
您必须包含-c SchoolContext参数以指定数据库上下文类,因为项目有两个上下文类(另一个是ASP.NET Identity)。
检查Up和Down方法
当您执行migrations add命令时,EF生成将从头创建数据库的代码。此代码位于Migrations文件夹中的名为的文件中_InitialCreate.cs。类的Up方法InitialCreate创建与数据模型实体集对应的数据库表,Down方法将删除它们,如下面的示例所示。
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Student",
columns: table => new
{
ID = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
EnrollmentDate = table.Column<DateTime>(nullable: false),
FirstMidName = table.Column<string>(nullable: true),
LastName = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Student", x => x.ID);
});
// Additional code not shown
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Course");
// Additional code not shown
}
}
迁移调用该Up方法来实现迁移的数据模型更改。当您输入回滚更新的命令时,Migrations会调用该Down方法。
此代码用于在输入migrations add InitialCreate命令时创建的初始迁移。迁移名称参数(在示例中为“InitialCreate”)用于文件名,可以是任何您想要的。最好选择一个字词或短语,总结迁移过程中所做的工作。例如,您可以将以后的迁移命名为“AddDepartmentTable”。
如果在数据库已存在时创建了初始迁移,则会生成数据库创建代码,但不必运行,因为数据库已与数据模型匹配。当您将应用程序部署到数据库尚不存在的另一个环境时,此代码将运行以创建数据库,因此首先测试它是一个好主意。这就是为什么你先更改了连接字符串中数据库的名称 - 这样迁移可以从头开始创建一个新的。
检查数据模型快照
迁移还会在Migrations / SchoolContextModelSnapshot.cs中创建当前数据库模式的“快照” 。下面是该代码的样子:
[DbContext(typeof(SchoolContext))]
partial class SchoolContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
modelBuilder
.HasAnnotation("ProductVersion", "1.0.0-rtm-21431")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("ContosoUniversity.Models.Course", b =>
{
b.Property<int>("CourseID");
b.Property<int>("Credits");
b.Property<string>("Title")
.HasAnnotation("MaxLength", 50);
b.HasKey("CourseID");
b.ToTable("Course");
});
// Additional code for Enrollment and Student tables not shown
modelBuilder.Entity("ContosoUniversity.Models.Enrollment", b =>
{
b.HasOne("ContosoUniversity.Models.Course", "Course")
.WithMany("Enrollments")
.HasForeignKey("CourseID")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("ContosoUniversity.Models.Student", "Student")
.WithMany("Enrollments")
.HasForeignKey("StudentID")
.OnDelete(DeleteBehavior.Cascade);
});
}
}
由于此代码必须在最新迁移后反映数据库状态,因此您无法通过删除名为的文件来删除迁移 __.cs。
如果删除该文件,则剩余的迁移将与数据库快照文件不同步。
要删除您添加的最后一个迁移,请使用dotnet ef migrations remove命令。
将迁移应用于数据库
在命令窗口中,输入以下命令以在其中创建数据库和表。
dotnet ef database update -c SchoolContext
命令的输出与命令migrations add类似。
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:17.34
Done.
使用SQL Server对象资源管理器来检查数据库,就像您在第一个教程中一样。
您将注意到添加了一个__EFMigrationsHistory表,以跟踪哪些迁移已应用于数据库。
查看该表中的数据,您将看到第一次迁移的一个条目。

运行应用程序以验证一切仍然与以前一样工作。

命令行界面(CLI)与软件包管理器控制台(PMC)
用于管理迁移的EF工具可从.NET Core CLI命令或Visual Studio 程序包管理器控制台(PMC)窗口中的PowerShell cmdlet获取。
本教程介绍如何使用CLI,但如果您愿意,可以使用PMC。
有关CLI命令的信息,请参阅.NET Core CLI。
有关PMC命令的信息,请参阅软件包管理器控制台(Visual Studio)。
作者没说,我就先写在这了吧。
我的建议是我们不要用上面的方式玩codefirst。跟着我的节奏来。
我们再来说说,我们常用的使用程序包管理控制台怎么玩Codefirst吧.
首先我们安装下

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
PM> Install-Package Microsoft.EntityFrameworkCore.Tools
看到上图了没,依次安装。
然后再回到文件DbInitializer把代码:
context.Database.EnsureCreated();
注释掉。

然后就跟用ef6一样了。在程序包管理控制台输入:
PM> Add-Migration InitFirstMigration

会生成两个迁移文件。
然后我们执行命令
PM> Update-database
整个工程就ok了。
基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5的更多相关文章
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-4
来个目录吧: 第一章-入门 第二章- Entity Framework Core Nuget包管理 第三章-创建.修改.删除.查询 第四章-排序.过滤.分页.分组 第五章-迁移,EF Core 的co ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-2
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 Entity Framework Core Nuget包管理 如果你创建项目的时候启用了个人身份验证的话,项目中就已经包含了EFCo ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-3
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 创建.查询.更新.删除 这章主要讲解使用EF完成 增删改查的功能. 自定义"详情信息"页面 我们通过基架生成的代 ...
- 基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术-Angel工作室通用权限管理
一.Angel工作室简单通用权限系统简介 AngelRM(Asp.net MVC Web api)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术 ...
- 基于ASP.NET的MVC框架下的MvcPaper分页控件的使用技术
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Webdiyer. ...
- 基于Asp.Net Core 2.1的简单问答社区系统源代码分享
看见园子里很多人都在分享源代码,我也来凑个热闹. 该项目基于.NET CORE 2.1(其实是从1.1开始开发的),经历过不停的调整终于有个能拿出手的版本了,第一次在博客园发文章. 使用到的技术以及框 ...
- ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
随机推荐
- python2 与 python3 如何实现共存
1.现在我本机系统已内置python2.6 2.下载进行源码安装 复制链接下载到 /root/mypackage,解压 接着 mkdir /usr/local/python3 然后在解压后的文件夹内执 ...
- Python使用np.c_和np.r_实现数组转换成矩阵
# -*- coding: utf-8 -*-"""Created on Sat Jun 30 14:49:22 2018 @author: zhen"&quo ...
- pandas的resample重采样
Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法. 降采样:高频数据到低频数据 升采样:低频数据到高频数据 主要函数:r ...
- 异常检测(anomaly detection)
版权声明:本文为博主原创文章,转载或者引用请务必注明作者和出处,尊重原创,谢谢合作 https://blog.csdn.net/u012328159/article/details/51462942 ...
- [转]extern "C"的作用
extern "C"的主要作用就是为了能够正确实现C++代码调用其它C语言代码. 加上extern “C”后,会指示编译器将这部分代码按C语言进行编译,而不是C++的.这是因为C+ ...
- Win10系统电脑桌面图标没有了怎么办
win10系统相对来说还是有些不稳定的,有时候打开电脑会发现,桌面上的图标不见了,遇见这种情况,先别着急,可以使用两种很简单的方法来解决. 方法一: 在桌面上右键,点击查看,看“显示桌面图标”这一项前 ...
- python之列表的常用操作
Python list 常用方法总结 一,创建列表 只要把逗号分隔的不同的数据项使用方括号([ ])括起来即可 下标(角标,索引)从0开始,最后一个元素的下标可以写-1 list = ['1 ...
- 初识Python - Python的历史(转)
声明: 本文转自维基百科 如有意见请联系删除 综述 该编程语言 的Python是在20世纪80年代末的设想,和实施是在1989年12月开始由吉多·范罗苏姆在CWI在荷兰的继任者农行能够异常处理,并与接 ...
- ABAP 中JSON格式的转换与解析
RT,JSON是当今十分流行的一种轻量数据格式,广泛地应用于各种数据交换场景中.本文会介绍一种比较简单的将ABAP中的数据转换为JSON格式的方法. (如果你是因为引号的问题搜索到了这篇文章,请直接拉 ...
- 定义 java 基本数据类型
package debug; class Demo { /* * 定义八种基本数据类型,如下 */ public static void main(String[] args) { //define ...