本文檔說明需在
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]