AspNet Core使用Mysql一些問題及解決方案


本文假設的你的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版。
將舊版刪除,重新安裝此預覽版。
目測暫時可正常運行項目。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM