zoukankan      html  css  js  c++  java
  • 第九节:EF Core各种迁移指令(CodeFirst和DBFirst)

    一. 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=123456;

    输入指令:【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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    NC 5的开发环境起不了客户端
    NC 6系初始化EJB
    ubuntu安装javaweb
    html 优化
    ubuntu
    jquery
    前端优化
    京东设计中心
    html cookie
    html5 use video camera
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/11633385.html
Copyright © 2011-2022 走看看