EFCore Code First生成数据库SOP步骤

Posted Akgu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EFCore Code First生成数据库SOP步骤相关的知识,希望对你有一定的参考价值。

1.创建数据模型类

public partial class SmsPush
    {
        [Key]
        public int Id { get; set; }
        [MaxLength(128)]
        public string AppName { get; set; }

        [DataType(DataType.Text)]
        public string TargetValue { get; set; }

        [DataType(DataType.Text)]
        public string Content { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime CreateTime { get; set; }
    }

  

2.安装 nuget 包

按您使用的数据选择包

  • sqlserver:Install-Package Microsoft.EntityFrameworkCore.SqlServer
  • mysqlInstall-Package MySql.Data.EntityFrameworkCore

3.创建数据库上下文类

public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<Movie> Movie { get; set; }
    }

  

4.注册数据库上下文

  • sqlserver
  • services.AddDbContext<MvcMovieContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
    
  • mysql
services.AddDbContext<PushContext>(options =>
            {
                options.UseMySQL(Configuration.GetConnectionString("PushContext"));
            });

  

5.添加数据连接字符串

上面的Configuration.GetConnectionString,是从appsettings.json中读取

{
  "ConnectionStrings": {
    "PushContext": "Persist Security Info=False;database=push-center;server=localhost;Connect Timeout=30;user id=root; pwd=111111"
  }
}

  mysql 链接字符串,参考 mysql 官方:https://dev.mysql.com/doc/dev/connector-net/8.0/html/P_MySql_Data_MySqlClient_MySqlConnection_ConnectionString.htm

6.安装 Mysql

推荐使用巧克力安装 mysql,一款越用越香的 windows 包管理器,如果不知道巧克力,请参考博文【nginx】Nginx 部署实战——静态文件+反向代理+均衡负载+https+websocket,有关于巧克力的安装,可以类比 centos 的黄狗(yum).

#安装mysql
choco install mysql
#遇到让你选择是否运行脚本,Y/A 按着走

  

  • 有可能会遇到在https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-winx64.zip下载巨慢的情况(在公司下载很快,晚上在家下载很慢,不知道为啥,想办法吧),可以在巧克力执行powershell之前,也就是提示选择他要执行 C:\\ProgramData\\chocolatey\\lib\\mysql\\tools\\chocolateyInstall脚本,去编辑这个脚本,替换为国内资源镜像
#第三行
$url = \'https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-winx64.zip\'
#替换为搜狐镜像 类似还有
#网易 http://mirrors.163.com/
#中科大 http://mirrors.ustc.edu.cn/
#清华 https://mirrors.tuna.tsinghua.edu.cn/
$url = \'http://mirrors.sohu.com/mysql/MySQL-8.0/mysql-8.0.20-winx64.zip\'

  不出意外,mysql就安装好了,路径C:\\tools,甚至相关 windows 服务也装好了。根据之前的经验【One by one 系列】一步步部署.Net core 应用-CentOs 介绍的 mysql 安装后,初始化密码

# 修改密码
# 初次安装mysql,root账户没有密码。直接登录
mysql -u root
mysql>show databases;
mysql>set password for \'root\'@\'localhost\' =password(\'设置你的密码\');
Query OK, 0 rows affected (0.00 sec)
#不需要重启数据库即可生效

  上面是针对 5.6 以下的版本有效,通过巧克力默认安装的是最新版本,是 8.0 版本,修改密码的操作需要更换如下 sql 语句。

mysql -u root

#初始化root账户的密码
mysql>ALTER USER root@localhost IDENTIFIED BY \'123456\';

  

7.初始迁移-Initial migration

运用 efcore 迁移功能来创建数据库。migration 是可用于创建和更新数据库以匹配数据模型的一组工具

#第一步
Add-Migration InitialCreate

#第二步
Update-Database

  

  • Add-Migration InitialCreate:生成 Migrations/{timestamp}_InitialCreate.cs 迁移文件 。InitialCreate 参数是迁移名称。可以使用任何名称,但是按照惯例,会选择可说明迁移的名称。因为这是首次迁移,所以生成的类包含用于创建数据库架构的代码。
  • Update-Database:将数据库更新到上一个命令创建的最新迁移。此命令运行在 Migrations/{time-stamp}_InitialCreate.cs 文件中 Up 方法,用于创建数据库的。
    • ps:Up 方法创建 表。Down 方法可还原 Up 迁移所做的架构更改。
  • 如果是数据库更新,会生成如下警告(可以忽略):
No type was specified for the decimal column \'Price\' on entity type \'Movie\'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using \'HasColumnType()\'.

  更多内容参考:https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/powershell

8.依赖注入数据库上下文

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }
}

  

9.迁移回退

依赖Microsoft.EntityFrameworkCore.Tools包,如果此包缺失,请安装。

#先检查下
Get-Help about_EntityFrameworkCore
PM> Get-Help about_EntityFrameworkCore

                     _/\\__
               ---==/    \\\\
         ___  ___   |.    \\|\\
        | __|| __|  |  )   \\\\\\
        | _| | _|   \\_/ |  //|\\\\
        |___||_|       /   \\\\\\/\\\\

TOPIC
    about_EntityFrameworkCore

SHORT DESCRIPTION
    Provides information about the Entity Framework Core Package Manager Console Tools.

LONG DESCRIPTION
    This topic describes the Entity Framework Core Package Manager Console Tools. See https://docs.efproject.net for
    information on Entity Framework Core.

    The following Entity Framework Core commands are available.

        Cmdlet                      Description
        --------------------------  ---------------------------------------------------
        Add-Migration               Adds a new migration.

        Drop-Database               Drops the database.

        Get-DbContext               Gets information about a DbContext type.

        Remove-Migration            Removes the last migration.

        Scaffold-DbContext          Scaffolds a DbContext and entity types for a database.

        Script-DbContext            Generates a SQL script from the current DbContext.

        Script-Migration            Generates a SQL script from migrations.

        Update-Database             Updates the database to a specified migration.

SEE ALSO
    Add-Migration
    Drop-Database
    Get-DbContext
    Remove-Migration
    Scaffold-DbContext
    Script-DbContext
    Script-Migration
    Update-Database

#上面是包没问题的象征,如果有问题,再执行如下命令
Install-Package Microsoft.EntityFrameworkCore.Tools

  To undo this action, use Remove-Migration.

# POCO类修改=>修改数据表
# 给本次迁移取一个名字:UpdateEditions,初始化取的名字:InitialCreate
Add-Migration UpdateEditions

# 更新
Update-Database

# 突然发现可能有影响,那就回滚吧,删除上一次迁移(回滚针对迁移进行的代码更改)
Remove-Migration

  

原文出处:微信公众号【DDGarfield 加菲的博客】

以上是关于EFCore Code First生成数据库SOP步骤的主要内容,如果未能解决你的问题,请参考以下文章

EFCore Database-first 批处理生成表结构

EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

如何使用EF Core Code-First桥接自己的表

EF Core 2.0使用MsSql/Mysql实现DB First和Code First

ef code first 怎样指定哪些类生成数据表?那些不生成数据表?

持续部署的 EF Core Code First 运行时迁移回滚策略