ASP.NET Core 2 使用 MySQL 作為資料庫

本篇建立在完成使用 Visual Studio Code 將模型新增至 ASP.NET Core 中的 Razor 頁面應用程式教學之後,已建立 Sqlite 作為資料庫,並完成本篇教學,預計將資料庫轉為 MySQL。

先將 MySQL NuGet 套件安裝到目前專案中,可參考 Database Providers

1
dotnet add package MySql.Data.EntityFrameworkCore

appsettings.json 中,將 MovieContext 資料取代為連線設定:

1
2
3
4
5
6
7
8
9
10
11
12
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"ConnectionStrings": {
// "MovieContext": "Data Source=MvcMovie.db",
"MovieContext": "server=192.168.99.100;database=mydatabase;user=myuser;password=mypassword"
}
}

Startup.cs 中,將 options.UseSqlite(Configuration.GetConnectionString("MovieContext")) 取代為 UseMySQL

1
2
services.AddDbContext<MovieContext>(options => 
options.UseMySQL(Configuration.GetConnectionString("MovieContext")));

接著於 CLI 中執行指令(若還沒 migrate 過,請先執行 dotnet ef migrations add InitialCreate):

1
dotnet ef database update

應會遇到 Table 'mydatabase.__EFMigrationsHistory' doesn't exist 的錯誤訊息,此為已知問題,可藉由新增這張資料表來解決此問題:

1
2
3
4
5
6
CREATE TABLE `__EFMigrationsHistory` 
(
`MigrationId` nvarchar(150) NOT NULL,
`ProductVersion` nvarchar(32) NOT NULL,
PRIMARY KEY (`MigrationId`)
);

新增後再重新執行 dotnet ef database update,成功後此時於資料庫中應可看到 Movie 資料表,此時即大功告成。

後記:若選擇 Pomelo.EntityFrameworkCore.MySql 應該就不會有資料表不存在的問題,而 ConnectionStrings 應改為以下格式:Server=localhost;database=mydatabase;uid=myuser;pwd=mypassword;

參考資料:

  1. Database Providers - EF Core | Microsoft Docs
  2. MySQL :: MySQL Connector/Net Developer Guide :: 8.3 Entity Framework Core Support
  3. EF Core `update-database` on MySql fails with `__EFMigrationsHistory’ doesn’t exist` - Stack Overflow