asp.net core webAPI学习笔记(六)数据库迁移

IDE 版本:Visual Studio 2017 15.9.7
asp.net core 版本 2.1.1

本文档说明需在
asp.net core webAPI学习笔记(一)项目搭建
的基础下进行

开发环境下的数据库迁移

在上一篇笔记中我们实现了根据现有数据库创建实体类的自动化操作,那如果数据库丢失了,我们该如何快速的根据现有实体类代码创建数据库呢

1. 新建数据库

当前情况是针对第一次对数据库进行迁移
安装NuGet包 Microsoft.EntityFrameworkCore.Tools
asp.net core webAPI学习笔记(六)数据库迁移_第1张图片
这里要选择与asp.net core版本相同
在这里插入图片描述

更改数据库名,这里的数据库会在接下来的命令行执行中自动创建
asp.net core webAPI学习笔记(六)数据库迁移_第2张图片
打开程序包管理控制台
asp.net core webAPI学习笔记(六)数据库迁移_第3张图片
输入命令 添加数据库迁移类

Add-Migration FirstMigration

会在项目中添加文件夹
asp.net core webAPI学习笔记(六)数据库迁移_第4张图片
输入数据库迁移命令

Update-Database -Verbose

创建完成
asp.net core webAPI学习笔记(六)数据库迁移_第5张图片

2. 更新数据库

当前情况是对数据库进行增量迁移,也就是实体类添加了新的字段,需要同步更新数据库表
[TODO]

生产环境下的数据库迁移

在生产环境部署时,EFcore同样可以使用命令行来进行数据库创建操作

1. 新建数据库

对项目进行发布
asp.net core webAPI学习笔记(六)数据库迁移_第6张图片
选择文件系统发布
asp.net core webAPI学习笔记(六)数据库迁移_第7张图片
发布后的文件目录结构
asp.net core webAPI学习笔记(六)数据库迁移_第8张图片
当前目录新建deploy-ef2dot1-migrations.bat文件,文件名可以自定义,写入以下代码

@ECHO OFF

REM *************************************************
REM here are the args for this script
REM 
REM deploy-ef2dot1-migrations.bat migrationsDllName [startupDllName] [dbContextClassName] 
REM 
REM Any of the args in [brackets] are optional
REM 
REM *************************************************

if [%1] EQU [] (
    ECHO no parameters specified
    ECHO this isn't going to work
    ECHO.
    ECHO here are the args for this script
    ECHO.
    ECHO deploy-ef2-migrations.bat migrationsDllName [startupDllName] [dbContextClassName] 
    ECHO.
    ECHO Any of the args in [brackets] are optional

    EXIT /B
)

set EfMigrationsNamespace=%1

if [%2] EQU [] (
    ECHO no additional parameters specified
    ECHO assuming everything in %1

    set EfMigrationsDllDepsJson=%~n1.deps.json
    set EfMigrationsDllRuntimeConfig=%~n1.runtimeconfig.json
    set EfMigrationsDllName=%1
    set StartupDllName=%1
) else (
    ECHO additional parameters were specified
    ECHO assuming migrations in one DLL and startup DLL is %2
    
    set EfMigrationsDllDepsJson=%~n2.deps.json
    set EfMigrationsDllRuntimeConfig=%~n2.runtimeconfig.json
    set EfMigrationsDllName=%1
    set StartupDllName=%2
)

set DllDir=%cd%
set PathToNuGetPackages=%USERPROFILE%\.nuget\packages
set PathToNuGetPackages_Fallback1="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback"
set PathToNuGetPackages_Fallback2="C:\Program Files\dotnet\sdk\NuGetFallbackFolder"

set PathToEfDll="not-found"

set PathToEfDll_Option=%cd%\ef.dll

if %PathToEfDll% EQU "not-found" (
  if exist %PathToEfDll_Option% (
      ECHO found ef.dll at %PathToEfDll_Option%
      set PathToEfDll=%PathToEfDll_Option%
  ) else (
    ECHO ef.dll not found at %PathToEfDll_Option%      
  )
)

set PathToEfDll_Option=%programfiles%\dotnet\sdk\2.1.301\DotnetTools\dotnet-ef\2.1.1\tools\netcoreapp2.1\any\tools\netcoreapp2.0\any\ef.dll

if %PathToEfDll% EQU "not-found" (
  if exist %PathToEfDll_Option% (
      ECHO found ef.dll at %PathToEfDll_Option%
      set PathToEfDll="%PathToEfDll_Option%"      
  ) else (
    ECHO ef.dll not found at %PathToEfDll_Option%      
  )
)

set PathToEfDll_Option=%PathToNuGetPackages_Fallback1%\microsoft.entityframeworkcore.tools.dotnet\2.0.1\tools\netcoreapp2.0\ef.dll

if %PathToEfDll% EQU "not-found" (
  if exist %PathToEfDll_Option% (
      ECHO found ef.dll at %PathToEfDll_Option%
      set PathToEfDll=%PathToEfDll_Option%
  ) else (
    ECHO ef.dll not found at %PathToEfDll_Option%      
  )
)

set PathToEfDll_Option=%PathToNuGetPackages%\microsoft.entityframeworkcore.tools.dotnet\2.0.0\tools\netcoreapp2.0\ef.dll

if %PathToEfDll% EQU "not-found" (
  if exist %PathToEfDll_Option% (
      ECHO found ef.dll at %PathToEfDll_Option%
      set PathToEfDll=%PathToEfDll_Option%
  ) else (
    ECHO ef.dll not found at %PathToEfDll_Option%      
  )
)

if %PathToEfDll% EQU "not-found" (
  ECHO.
  ECHO **** ERROR: could not find ef.dll ****
  ECHO.
  ECHO OH! SUCH UNRELENTING FAILURE! 
  ECHO But it wasn't like we didn't try.  This script actually looked in different 3 places for ef.dll.
  ECHO Let's face it.  It's that ef.dll that we really need to do an ef migration deploy with just the DLLs.
  ECHO But that ef.dll is tricky to find.
  ECHO.
  ECHO Be sure to tell the EF Core team how hard it is to deploy migrations via DLL.
  ECHO And let them know that it's mostly because it's impossible to find the ef.dll.
  ECHO It would be so much easier if we could just grab ef.dll during the build and 
  ECHO have it show up as a dependency in our "dotnet publish" output dir.
  ECHO.
  ECHO Oh? You want the link to their github project so you can mention it directly 
  ECHO to them in a discussion and tag @benday in that discussion? 
  ECHO That's a great idea!  Here ya go.  Here's the link to the EF Core project.
  ECHO https://github.com/aspnet/EntityFrameworkCore
  ECHO Just remember to be polite.  And also remember that @bricelam is a good guy.  
  ECHO.
  ECHO And on that note, exiting...
  ECHO.
  ECHO ps. sorry your ef core migrations didn't deploy.  :(
  EXIT /b 1
)

if [%3] EQU [] (
    ECHO no dbcontext name parameter specified
    ECHO here's hoping that everything works out for you
    ECHO. 
    ECHO here goes nuthin'...
    ECHO.

    dotnet exec --depsfile .\%EfMigrationsDllDepsJson% --additionalprobingpath %PathToNuGetPackages% --additionalprobingpath %PathToNuGetPackages_Fallback1% --additionalprobingpath %PathToNuGetPackages_Fallback2% --runtimeconfig %EfMigrationsDllRuntimeConfig% %PathToEfDll% database update --assembly .\%EfMigrationsDllName% --startup-assembly .\%EfMigrationsDllName% --project-dir . --verbose --root-namespace %EfMigrationsNamespace%    
) else (
    ECHO dbcontext name parameter was specified
    ECHO the dbcontext class name I'll be using is %3
    ECHO. 
    ECHO here goes nuthin'...
    ECHO.
    
    dotnet exec --depsfile .\%EfMigrationsDllDepsJson% --additionalprobingpath %PathToNuGetPackages% --additionalprobingpath %PathToNuGetPackages_Fallback1% --additionalprobingpath %PathToNuGetPackages_Fallback2% --runtimeconfig %EfMigrationsDllRuntimeConfig% %PathToEfDll% database update --assembly .\%EfMigrationsDllName% --startup-assembly .\%EfMigrationsDllName% --project-dir . --verbose --root-namespace %EfMigrationsNamespace% --context %3
)

找到ef.dll, 2.1版本的位置是在
C:\Users\Amon.nuget\packages\microsoft.entityframeworkcore.tools\2.1.1\tools\netcoreapp2.0\any\ef.dll

放入当前目录中
asp.net core webAPI学习笔记(六)数据库迁移_第9张图片
命令行跳转到当前目录,执行命令

deploy-ef2dot1-migrations.bat [项目dll名称] [实体类所在的dll名称] [DbContext类名称]

对于我当前的项目来说,应该输入

deploy-ef2dot1-migrations.bat testProduce testProduce testProduceContext

由于实体类放在了主项目中,所以第一个参数和第二个参数都是主项目的namespace

asp.net core webAPI学习笔记(六)数据库迁移_第10张图片
执行成功
以上内容参考自这里

2. 更新数据库

[TODO]

你可能感兴趣的:(.NET,Core,WebAPI)