一. CodeFirst模式指令

1.前提:

  必须的程序集: Microsoft.EntityFrameworkCore.Tools

          Microsoft.EntityFrameworkCore.Design

  EF自身的程序集:Microsoft.EntityFrameworkCore

           Microsoft.EntityFrameworkCore.SqlServer

2. 常见指令

(1).创建迁移:Add-Migration xxxx

说明:生成迁移文件,有三个,分别是:

  a: 20191025092317_initCreate1:主迁移文件。 包含应用迁移所需的操作 Up() 和 还原迁移所需的操作 Down()

  b: 20191025092317_initCreate1.Designer.cs:迁移元数据文件。 包含 EF 所用的信息,如给实体类型构建属性、主键、外键、索引、映射到数据表,主体和依赖关系等等。

  c: YpfDbContextModelSnapshot:当前模型的快照。用于确定添加下一次迁移时更改的内容(用于递增更新)。

(2).更新(创建)数据库:Update-Database xxxx

说明:根据迁移 创建/更新 数据库

(3).删除迁移:Remove-Migration

       Update-Database -Migration:0 (代表:删除数据库中所有表,仅仅剩了一个迁移表了)

(4).生成SQL脚本:Script-Migration -Output D:\InitialCreate.sql

          Script-Migration -From 0 -To InitialCreate -Output D:\InitialCreate.sql

(5).删除数据库:Drop-Database

 会产生指令:[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助(默认为“Y”):,输入Y,即可以删除。

3.代码配置

(1).运行时迁移:dbContext.Database.Migrate();

        dbContext.GetService<IMigrator>();

PS:找最新的迁移文件,更新或创建数据库,等效于上面的 Update-Database xxxx

(2).删除数据库:dbContext.Database.EnsureDeleted();

(3).创建数据库:dbContext.Database.EnsureCreated();

(4).生成创建数据库的语句:var sql = dbContext.Database.GenerateCreateScript();

4. 案例说明

(1). 新建两张表 UserInfor,RoleInfor,上下文YpfDbContext,并做好相应的依赖注入配置,数据库链接如下:

Server=localhost;Database=dbCore1;User ID=sa;Password=;

输入指令:【Add-Migration initCreate1】,会生成迁移文件。

输入指定:【Update-Database initCreate1】,将迁移文件映射生成对应的数据库。

 (2). 后续无论是增加还是减少、修改相关操作,都是先生成迁移文件,然后映射到数据库。

比如:RoleInfor表中增加一个字段addTime,则

先输入指令:【Add-Migration initCreate2】,会生成迁移文件。

先输入指定:【Update-Database initCreate2】,将迁移文件映射生成对应的数据库。

如果这个时候再执行一下【Update-Database initCreate1】,数据库就会回到initCreate1的迁移,会发现数据库RoleInfor表中的addTime字段已经不见了,但是代码中RoleInfor类中addTime字段还存在。

二. DBFirst模式指令

1. 前提

  必须的程序集:Microsoft.EntityFrameworkCore.Tools

2.常见指令

(1).数据库连接字符串

  "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;"

(2).基础命令

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer】

解释:

  全部生成在根目录;上下文默认名称为:数据库名+Context;类名中'_'省略了;映射生成类的属性:首字母大写;默认采用FluentApi的方式配置; 默认映射生成所有的表。

(3).指定上下文 和 实体的目录

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models】

解释:

①. -ContextDir DbContext : 代表EF上下文类放在DbContex文件夹的目录下

②. -OutputDir Models:代表所有的实体类放在Models文件夹的目录下

(4).指定表

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor】

解释:

①:-Tables T_UserInfor,T_RoleInfor:仅映射生成 T_UserInfor,T_RoleInfor

(5).指定EF上下文名称

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor -Context ypfContext 】

解释:

①:-Context ypfContext:代表指定EF上下文的名称为“ypfContext”,默认的生成规则是: 数据库名+Context

(6).保留数据库和表的名称

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor -Context ypfContext -UseDatabaseNames 】

解释:

①:-UseDatabaseNames:代表完全按照数据库中表名或字段来映射生成相应的实体

(7).指定FluentApi 或 数据注解

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor -Context ypfContext -UseDatabaseNames -DataAnnotations】

解释:

①. -DataAnnotations: 代表用数据注解的形式配置实体类属性,默认用的是FluentApi的形式进行配置。

(8).覆盖指令(全表的)

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations -Force】

解释:

①. 如果数据变动很小,那么我们完全可以手动的去改一下代码的配置即可。

②. 如果数据库修改内容多,手动修改代码配置会很麻烦,这个时候我们使用指令 【-Force】再次映射,即覆盖了原先的代码配置映射

特别注意:

-Force指令:可以同步数据库表的增加,字段增加修改删除,但是如果数据库中删除了一张表,该指令只能同步EF上下文中的配置,删除不了对应的类,需要手动到代码中删除对应的映射类

最终指令总结:

(1).全表的首次映射:

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations】

(2).全表的后续修改:

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations -Force】

3. 配置用户私密

(1).先右键选中项目,点击“管理用户机密”,会弹出一个secret.json的空文件,保存一下。这个时候右键点击“编辑xxx.csproj”,会发现多了一个:

<UserSecretsId>a030bf23-9ce4-4051-9d99-0d2f91b636d6</UserSecretsId>

这个就代表可以用来映射机密文件的ID。

(2).进入到项目的根目录,Shift右键管理员运行,运行下面指令,则将配置文件存入到了加密区。

【dotnet user-secrets set myDBStr "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" 】

(3).运行指令进行映射

【Scaffold-DbContext Name=myDBStr Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations】

注:生成的EF上下文中的OnConfiguring方法中,连接字符串也使用了机密文件,如下:

optionsBuilder.UseSqlServer("Name=myDBStr");  但是这种模式不支持这么连接,必须改成依赖注入的方式才可以使用机密文件,如下:

services.AddDbContext<ypfContext>(option => option.UseSqlServer("Name=myDBStr"));

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第九节:EF Core各种迁移指令(CodeFirst和DBFirst)的更多相关文章

  1. EF Core新增迁移时无法加载程序集“System.ValueTuple”的错误

    EF Core使用迁移命令时,如: Add-Migration Init 有时会出现如下错误: System.IO.FileLoadException: Could not load file or ...

  2. [EF Core]数据迁移(二)

    摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...

  3. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  4. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  5. .net core2.1 - ef core数据库迁移,初始化种子数据

    起因:早上偶然看见一篇文章说是ef core(2.x)使用种子数据,主表子表迁移时候,正常情况下说是无法迁移成功,索性就试试,结果是和ef6的一样,没感觉有什么大的区别.一切OK,见下面内容. 1.首 ...

  6. ef core数据迁移的一点小感悟

    ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...

  7. 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)

    一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...

  8. EF Core数据迁移操作

    摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...

  9. 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

    一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...

随机推荐

  1. python 手机app数据爬取

    目录 一:爬取主要流程简述 二:抓包工具Charles 1.Charles的使用 2.安装 (1)安装链接 (2)须知 (3)安装后 3.证书配置 (1)证书配置说明 (2)windows系统安装证书 ...

  2. CSS 基础面试题

    1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin 低版本IE盒子模型:宽 ...

  3. 什么是LNMP架构

    LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写.L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python ...

  4. Linux CentOS 下安装.net core sdk

    注册Microsoft密钥 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm ...

  5. PHP 简单面向对象 验证码类(静态实例对象调用)

    没事写了一个简单的面向对象验证码类,可以直接使用(替换一下字体路径) <?php class authCode { private static $instance = null; #实例对象 ...

  6. Outlook API

    1.Outlook简介 若要从Outlook 外控制Outlook对象,必须在编写代码的工程中建立对Outlook对象库的引用. 1.1  Outlook Application说明: 代表整个Mic ...

  7. 转 echarts 的使用时遇到的坑 初始化和销毁,亲测有效!

    纵观ECharts图表实例化的API,主要有一下几个相关的实例化方法: 1.setOption(Object option,{boolean = true} notMerge) 参数: 1).Obje ...

  8. Web Service 接口测试

    Web Service 接口测试 Web service 概念 Web service使用与平台和编程语言无关的方式进行通讯的一项技术, web service 是一个接口, 他描述了一组可以在网络上 ...

  9. ZAP 代理 Chrome 系统 win10

    ZAP 代理原理 如下浏览器,拿Chrome为例,Chrome发出的请求都会先经过 ZAP, 然后再由 ZAP 发往服务器.如下图: Chrome 设置 1. Chrome设置只需要在地址栏输入 ch ...

  10. 12、shell_awk

    AWK awk 是一个优良的文本处理工具,其名字来源于三个开发人员的名字首字母缩写. awk 不但是一个优良的文件处理工作,它还可以自己编程,编写awk 程序   AWK基本格式:      awk ...