来个目录吧:

第一章-入门

第二章- 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的更多相关文章

  1. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1

    来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...

  2. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-4

    来个目录吧: 第一章-入门 第二章- Entity Framework Core Nuget包管理 第三章-创建.修改.删除.查询 第四章-排序.过滤.分页.分组 第五章-迁移,EF Core 的co ...

  3. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-2

    来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 Entity Framework Core Nuget包管理 如果你创建项目的时候启用了个人身份验证的话,项目中就已经包含了EFCo ...

  4. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-3

    来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 创建.查询.更新.删除 这章主要讲解使用EF完成 增删改查的功能. 自定义"详情信息"页面 我们通过基架生成的代 ...

  5. 基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术-Angel工作室通用权限管理

    一.Angel工作室简单通用权限系统简介 AngelRM(Asp.net MVC Web api)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术 ...

  6. 基于ASP.NET的MVC框架下的MvcPaper分页控件的使用技术

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using Webdiyer. ...

  7. 基于Asp.Net Core 2.1的简单问答社区系统源代码分享

    看见园子里很多人都在分享源代码,我也来凑个热闹. 该项目基于.NET CORE 2.1(其实是从1.1开始开发的),经历过不停的调整终于有个能拿出手的版本了,第一次在博客园发文章. 使用到的技术以及框 ...

  8. ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  9. ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

随机推荐

  1. JavaScript大杂烩8 - 理解文本解析的"黄金搭档"

    文本解析"黄金搭档" - String与RegExp对象 文本解析是任何语言中最常用的功能,JavaScript中也是一样,而正则表达式作为最常用的方式,JavaScript也同样 ...

  2. UF清log

    set rowcount 20000delete from UFSystem..ua_logset rowcount 0 truncate table ua_log_bak20111201 trunc ...

  3. PHP实现一个简陋的注册登录页面

    PHP实现一个简陋的注册登录页面 今天来水一篇没有**用的 /滑稽脸,代码简陋臃肿考虑不全,各位大佬轻喷,还望不吝赐教. 首先考虑了一下需要至少四个页面:register.html.register. ...

  4. Linux 小知识翻译 - 「环境变量」

    这次,谈谈关于「环境变量」的话题. 所谓变量,就是在程序中设置的,相当于在内存中准备的「一个用来存放数据的小箱子」. 即,程序通过变量来保存值,通过变量保存的内容来进行各式各样的计算处理. 「环境变量 ...

  5. scanf函数(初学者)

    scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 1.scanf函数的一般形式:scanf函数是一个标准的库函数,它的函数原型在头文件“stdio.h”中,与pr ...

  6. Vue框架的两种使用方式

    1.单页面应用:使用Vue CLI工具生成脚手架,这是最常见的使用方式,简单用模板生成一个HelloWorld Demo,可以学习Vue的SPA项目结构 2.传统多页面应用:通过script引入Vue ...

  7. python之面向对象进阶3

    1.isinstace和issubclass 2.staticmethod和classmethod 3.反射(hasattr.getattr.setattr.delattr等四个方法) 4.内置方法 ...

  8. Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  9. Qt 编程指南 9 软件打包

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑 里无法正常运行.因此 Qt 官方开发环境里自带了一 ...

  10. solidity 汇编语言问题——内存数据mload时为什么从第32位开始

    问题:内存数据mload时为什么从第32位开始 代码出处:https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d pragma so ...