一. 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. P5124 Teamwork(DP)

    题目: P5124 [USACO18DEC]Teamwork 解析: 动态规划,设\(f[i]\)表示到第\(i\)位的最大值,我们枚举i之前的j个位置\((j<k)\),记录一下这\(j+1\ ...

  2. Hystrix核心熔断器

    在深入研究熔断器之前,我们需要先看一下Hystrix的几个重要的默认配置,这几个配置在HystrixCommandProperties 中 //时间窗(ms) static final Integer ...

  3. iOS - 常用宏定义和PCH文件知识点整理

    (一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...

  4. [b0015] python 归纳 (一)_python组织方式

    结论: xxx.yyyy yyyy 可以是 类.类对象.函数.变量 xxx 可以是 包.模块.类 代码: ref1.py # -*- coding: utf-8 -*- import os class ...

  5. vnc服务器和windows2012密钥

    [root@localhost ~]# vncserver #启动服务器 windows 2012 64位-server版本的密钥 Windows Server 2012 Standard 密钥:NB ...

  6. springcloud学习之路: (三) springcloud集成Zuul网关

    网关就是做一下过滤或拦截操作 让我们的服务更加安全 用户访问我们服务的时候就要先通过网关 然后再由网关转发到我们的微服务 1. 新建一个网关服务Module 2. 依然选择springboot工程 3 ...

  7. 构建根文件系统之busybox

    配置busybox 首先将busybox的压缩包放入服务器进行解压缩: busybox集合了几百个命令,在一般的系统中并不需要全部使用.可以通过配置busybox来选择这些命令.定制某些命令的功能(选 ...

  8. 201871010133-赵永军《面向对象程序设计(java)》第十四周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第十四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. O2O场景下的推荐排序模型:

    推荐系统遇上深度学习(五)--Deep&Cross Network模型理论和实践 发表: 2018-04-22 推荐系统遇上深度学习系列:推荐系统遇上深度学习(一)--FM模型理论和实践:ht ...

  10. Python-numpy包中多维数组转置,transpose.swapaxes的轴编号(axis)的理解

    transpose()中三个轴编号的位置变化理解 transpose(a,b,c)其中a轴编号即为参考编号,垂直于a的平面即为所有平面,该平面上的数据再根据b,c相对于(0,1,2)的位置关系进行改变 ...