一. 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. Comet OJ-2019国庆欢乐赛

    国庆玩的有点嗨,开学了补题. A轰炸平面镇魂曲 题目描述 虹村万泰是一位二维世界的替身使者,他的替身 "轰炸平面镇魂曲" 能产生一条直线分割整个平面. 一开始,平面上有一个矩形,其 ...

  2. maven 学习---POM机制

    POM 代表工程对象模型.它是使用 Maven 工作时的基本组建,是一个 xml 文件.它被放在工程根目录下,文件命名为 pom.xml. POM 包含了关于工程和各种配置细节的信息,Maven 使用 ...

  3. Qt压缩和解压 zip

    zlib编译详见 https://blog.csdn.net/zhangxuechao_/article/details/85049711 下载quazip https://github.com/st ...

  4. tornado的请求与响应

    tornado请求与响应相关 一.配置文件config.py 中的settings 有哪些配置: debug:设置tornado是否工作再调试模式下,默认为false 即工作再生产模式下 true的特 ...

  5. [Go] golang设置运行的cpu数

    package main import( "fmt" "runtime" ) func main() { cpuNum:=runtime.NumCPU() fm ...

  6. FCOS及其和Faster R-CNN的区别

    RetinaNet,SSD,YOLOv3,Faster R-CNN等都是Anchor-based的检测器,即需要预定义的Anchor boxes来进行训练.FCOS是一种Anchor-free和Pro ...

  7. Shiro RememberMe 1.2.4 反序列化漏洞复现

    目录 原理解释 环境搭建 复现过程 原理解释   Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.   shiro默认使用了CookieRememberMeMana ...

  8. 目标检测论文解读1——Rich feature hierarchies for accurate object detection and semantic segmentation

    背景 在2012 Imagenet LSVRC比赛中,Alexnet以15.3%的top-5 错误率轻松拔得头筹(第二名top-5错误率为26.2%).由此,ConvNet的潜力受到广泛认可,一炮而红 ...

  9. node知识

    node中的url url中的方法: parse,resolve,format: 方法parse: 例子:url.parse('http://imooc.com/course/list'); 结果:{ ...

  10. i++和++1

    概述:i++和++i 这个问题困扰了我很长时间,在这段时间里自己不止一次的怀疑自己的智商,难道自己对编程一点天赋都没有吗?此问题严重打击了我的自信心.......也曾苦苦暗自琢磨,也曾百度谷歌疯狂搜索 ...