當我們在編寫基于數(shù)據(jù)庫的應(yīng)用程序時,隨著需求的增加和改變,我們需要升級我們的數(shù)據(jù)庫,變更數(shù)據(jù)庫表的字段,當我們的系統(tǒng)的不同版本被部署到了不同的客戶那里,在需要給客戶升級時,我們?nèi)绾螌崿F(xiàn)數(shù)據(jù)庫模式 (schema) 的自動升級呢?
傳統(tǒng)的管理辦法是針對每個數(shù)據(jù)庫版本,開發(fā)者手工編寫升級腳本。在需要升級的時候,找到對應(yīng)的腳本挨個升級到指定的版本。編寫升級腳本是一件枯燥乏味且容易出錯的工作,手動升級也需要細心的操作。
數(shù)據(jù)庫遷移工具能否幫助我們解決這個問題,在 JAVA 世界有 Red Gate,Liquibase 這樣的解決方案。.Net Core 提供了 Entity Framework 數(shù)據(jù)遷移工具。它可以幫助我們自動管理數(shù)據(jù)庫模式,把不同版本的數(shù)據(jù)庫升級到最新版本上。
下面以 asp.net core 服務(wù)為例,簡要介紹如何使用 .Net Core Entity Framework Database Migration Tools
安裝 EF 工具
首先我們需要安裝 dotnet-ef,打開命令行,輸入如下命令:
dotnet tool install --global dotnet-ef
如果不安裝這個工具,我們可能會看到下面的錯誤:
創(chuàng)建數(shù)據(jù)庫項目,建立第一個遷移
進入 Visual Studio 創(chuàng)建一個 asp.net core 項目,然后在 program.cs 里加入以下代碼:
builder.Services.AddDbContext<YourDbContext>(
options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
我們的配置文件,應(yīng)該是這個樣子的:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Server=172.28.64.136;Database=YourDatabaseName;UID=sa;PWD=YourPassword;trustServerCertificate=true"
}
}
新建一個 YourDbContext 類,它應(yīng)該類似于下面的代碼:
public class YourDbContext : DbContext
{
public YourDbContext (DbContextOptions<EnrollmentContext> options) : base(options)
{
}
public DbSet<Enrollment> Enrollments { get; set; }
}
下表是我們的第一個數(shù)據(jù)庫表對應(yīng)的類,為了不綁定固定的數(shù)據(jù)庫,我們使用了通用的標記:
public class Enrollment
{
public Guid Id { get; set; }
#region OTP
[MaxLength(16)]
public String? OtpPassword { get; set; }
public DateTime? Expiration { get; set; }
#endregion
#region Player Info
[MaxLength(64)]
public string PlayerId { get; set; }
[MaxLength(128)]
public string Name { get; set; }
public DateTime Birthday { get; set; }
[StringLength(3)]
public string CountryIsoCode { get; set; }
[MaxLength(128)]
public string Email { get; set; }
#endregion
}
編譯成功后,在項目文件夾下輸入下面的命令:
dotnet ef migrations add InitialCreate
命令運行成功后,我們會在項目下發(fā)現(xiàn)一個新的文件夾,類似于下面的圖片:
執(zhí)行遷移升級數(shù)據(jù)庫
當我們的第一個遷移建立好了以后,我們就可以連接數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫表了。執(zhí)行下面的命令升級數(shù)據(jù)庫:
dotnet ef database update
升級成功后就可以看到類似于下面的結(jié)果了:
修改數(shù)據(jù)庫模式,再次升級數(shù)據(jù)庫
我們發(fā)現(xiàn)上面的 Enrollment 表沒有記錄創(chuàng)建時間。我們給它增加一個字段,名字叫 CreatedDate?,F(xiàn)在代碼被改為如下:
public class Enrollment
{
public Guid Id { get; set; }
#region OTP
[MaxLength(16)]
public String? OtpPassword { get; set; }
public DateTime? Expiration { get; set; }
#endregion
#region Player Info
[MaxLength(64)]
public string PlayerId { get; set; }
[MaxLength(128)]
public string Name { get; set; }
public DateTime Birthday { get; set; }
[StringLength(3)]
public string CountryIsoCode { get; set; }
[MaxLength(128)]
public string Email { get; set; }
#endregion
public DateTime CreatedDate { get; set; }
}
然后運行下面的命令,增加第二個遷移。注意,在修改完上面的代碼以后一定要編譯我們的項目,否則下面的命令可能偵測不到代碼的變化。
dotnet ef migrations add addEnrollmentCreatedDate
完成以后,項目的 migration 文件夾會增加一個 addEnrollmentCreatedDate.cs 文件。
再次運行下面的命令,我們就可以把代碼的變化應(yīng)用到數(shù)據(jù)庫了:
dotnet ef database update
常見問題
在生產(chǎn)環(huán)境如何遷移
上面的方法需要安裝 .Net Core SDK, 在生產(chǎn)環(huán)境下可以運行以下命令生成執(zhí)行遷移:
dotnet ef migrations script --idempotent
啟動項目和數(shù)據(jù)庫項目分開的問題
如果我們的啟動項目 (startup project)和我們的數(shù)據(jù)庫項目是分開建立,那么運行上面的命令可能會出現(xiàn)錯誤,解決方案是在數(shù)據(jù)庫項目下運行遷移命令,但是需要加上 --startup 參數(shù)。類似于下面的示例:
dotnet ef --startup-project ..\EnrollmentApi\ migrations add InitialCreate
SSL Error
如果出現(xiàn)下面的錯誤,我們需要給數(shù)據(jù)庫連接串加上 trustServerCertificate=true
A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.)
https://stackoverflow.com/questions/72190575/asp-net-core-web-api-update-database-failed-due-to-provider-ssl-provider-err文章來源:http://www.zghlxwxcb.cn/news/detail-452496.html
結(jié)論
我們可以使用 .Net EF Migrations Tools 來管理我們的數(shù)據(jù)庫變更,這樣就可以不用擔心客戶的數(shù)據(jù)庫版本跟最新版本不一致而導(dǎo)致的變更跟蹤太復(fù)雜的問題了。文章來源地址http://www.zghlxwxcb.cn/news/detail-452496.html
到了這里,關(guān)于如何使用 .Net Core 實現(xiàn)數(shù)據(jù)庫遷移 (Database Migration)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!