本文假設的你的AspNet Core 2.2的Web程序通過EntityFrameworkCore連接使用MSSQL數據庫,能正常使用。
如何想轉為使用Mysql,其實不難。
1、安裝Mysql
這個簡單,從官網https://www.mysql.com/downloads/可以直接下載,無需注冊網站。個人使用只需要Community社區版即可。
如果下載的是zip壓縮版,解壓到相應位置。添加my.ini到mysql安裝目標,網上可以很容易搜索找到。
命令行模式進入安裝目錄下的bin內:
(1)運行mysqld --initialize --console,記住顯示的root的初始化密碼。
(2)安裝windows的mysql服務:mysqld --install [服務名]
(3)運行net start mysql啟動服務。
(4)運行mysql -u root -p,輸入初始化密碼登錄。
(5)正常進入mysql后,運行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼'; 修改密碼。
(6)幾條常用命令:show databases;顯示數據庫//use 數據庫名;設置當前數據庫//show tables;顯示當前數據庫的表。//drop database 數據庫;刪除數據庫。
2.修改數據庫連接
編輯web項目下的appsetings.json文件,修改或添加:
"ConnectionStrings": { "MysqlConnection": "Data Source=localhost;Database=數據庫名;User ID=root;Password=密碼;pooling=true;CharSet=utf8;port=3306;sslmode=none" },
3.添加程序包
web項目右擊運行"管理NuGet程序包...",瀏覽添加Pomelo.EntityFrameworkCore.MySql。(如果添加官方的Mysql.Data.EntityFrameworkCore,之后出現會一些問題)。
4.編輯配置Mysql服務
編輯web項目下的Startup.cs文件,在ConfigureServices方法中,將原來的UserSqlServer服務項注釋掉,添加
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql( Configuration.GetConnectionString("MysqlConnection")));
其中ApplicationDbContext替換為你的數據庫上下文,MysqlConnection為第2步設置的連接串名。
(使用官方Mysql.Data.EntityFrameworkCore時,上面內容為options.UseMySQL)
5.運行程序
如果你配置了Code First,現在運行程序應該可以自動創建數據庫和導入數據。
6.幾個問題
如果你的Web使用了官方個人用戶標識Identity,直接使用Mysql可能會出現一些問題。
(1)ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes)。
原因是個人用戶標識Identity一些表使用復合字段索引,而這些字段是字符型,這樣容易造成mysql主鍵索引超長問題。
解決辦法:先刪除數據庫和之前的遷移目錄(注意備份),編輯數據上下文類所在類,添加
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // UserLogins用戶登錄表最大字長限制(否則mysql中出現索引超出長度限制3073字節問題) builder.Entity<IdentityUserLogin<string>>(b => { b.HasKey(t => new { t.LoginProvider, t.ProviderKey }); b.Property(u => u.LoginProvider).HasMaxLength(128); b.Property(u => u.ProviderKey).HasMaxLength(128); b.ToTable("AspNetUserLogins"); }); builder.Entity<IdentityUserToken<string>>(b => { b.Property(t => t.LoginProvider).HasMaxLength(128); b.Property(t => t.Name).HasMaxLength(128); b.HasKey(t => new { t.UserId, t.LoginProvider, t.Name }); b.ToTable("AspNetUserTokens"); }); builder.Entity<IdentityUserRole<string>>(b => { b.Property(t => t.UserId).HasMaxLength(128); b.Property(t => t.RoleId).HasMaxLength(128); b.HasKey(r => new { r.UserId, r.RoleId }); b.ToTable("AspnetUserRoles"); }); }
以上三個表都使用復合字段索引,所以添加了最大字段長度,這樣就可以避免這個問題了。
可以通過程序包管理控制台運行Add-Migration InitData和Update-Database看看能否正常遷移數據庫。
(2)如何你現在使用3.0以上版本Netcore,繼續使用2.2.x版的Pomelo.EntityFrameworkCore.MySql會出現各種運行錯誤(2019.11.4新增)
請重新運行NuGet,並將包含預覽版檢測框加上勾,因為目前Pomelo.EntityFrameworkCore.MySql的最新版只有3.0.0-rc1.final版。
將舊版刪除,重新安裝此預覽版。
目測暫時可正常運行項目。