asp.net core webAPI學習筆記(六)數據庫遷移

本文檔說明需在
asp.net core webAPI學習筆記(一)項目搭建
的基礎下進行

開發環境下的數據庫遷移

在上一篇筆記中我們實現了根據現有數據庫創建實體類的自動化操作,那如果數據庫丟失了,我們該如何快速的根據現有實體類代碼創建數據庫呢

1. 新建數據庫

當前情況是針對第一次對數據庫進行遷移
安裝NuGet包 Microsoft.EntityFrameworkCore.Tools
在這裏插入圖片描述
這裏要選擇與asp.net core版本相同
在這裏插入圖片描述

更改數據庫名,這裏的數據庫會在接下來的命令行執行中自動創建
在這裏插入圖片描述
打開程序包管理控制檯
在這裏插入圖片描述
輸入命令 添加數據庫遷移類

Add-Migration FirstMigration

會在項目中添加文件夾
在這裏插入圖片描述
輸入數據庫遷移命令

Update-Database -Verbose

創建完成
在這裏插入圖片描述

2. 更新數據庫

當前情況是對數據庫進行增量遷移,也就是實體類添加了新的字段,需要同步更新數據庫表
[TODO]

生產環境下的數據庫遷移

在生產環境部署時,EFcore同樣可以使用命令行來進行數據庫創建操作

1. 新建數據庫

對項目進行發佈
在這裏插入圖片描述
選擇文件系統發佈
在這裏插入圖片描述
發佈後的文件目錄結構
在這裏插入圖片描述
當前目錄新建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

放入當前目錄中
在這裏插入圖片描述
命令行跳轉到當前目錄,執行命令

deploy-ef2dot1-migrations.bat [項目dll名稱] [實體類所在的dll名稱] [DbContext類名稱]

對於我當前的項目來說,應該輸入

deploy-ef2dot1-migrations.bat testProduce testProduce testProduceContext

由於實體類放在了主項目中,所以第一個參數和第二個參數都是主項目的namespace

在這裏插入圖片描述
執行成功
以上內容參考自這裏

2. 更新數據庫

[TODO]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章