1. 程式人生 > >asp.net core 2.1 Mysql 資料庫遷移,遇坑記錄

asp.net core 2.1 Mysql 資料庫遷移,遇坑記錄

首先來一段錯誤

immodeMacBook-Pro:tz.efcontext immo$ dotnet ef database update
Unable to create an object of type 'AppDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<AppDbContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time

上面有提示中有兩個解決方案

一個是“IDesignTimeDbContextFactory”

一個是後面的地址

地址裡面有兩個解決方案

一個是無參建構函式

另外一個就是上面那個【有點廢話】

無參玩失敗了,只能走下面的“IDesignTimeDbContextFactory”

實現程式碼可以看ef擴充套件的mysql類庫“Pomelo.EntityFrameworkCore.MySql”  ,在搭建環境的時候肯定會用到

實現程式碼【最終版】

using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;

namespace tz.efcontext
{
    public class DesignTimeDbContextFactory: IDesignTimeDbContextFactory<AppDbContext>
    {
        
        public AppDbContext CreateDbContext(string[] args)
        {

            //下面是官方程式碼,但是由於我是自己新建的類庫,不是web專案,所以點不出 SetBasePath 來,可以自己想辦法讀取到web專案的配置檔案裡面的配

            //IConfigurationRoot configuration = new ConfigurationBuilder()
            //    .SetBasePath(Directory.GetCurrentDirectory())
            //    .AddJsonFile("appsettings.json")
            //    .Build();
            //var connectionString = configuration.GetConnectionString("AppSqlConnection");

            //資料庫連線字串
            var connectionString = "Server=oauth.zhouquan.wang;database=xxhbg;uid=dba_xxhbg;pwd=dba_6462xxhbg;Character Set=utf8;persist security info=True";

            var builder = new DbContextOptionsBuilder<AppDbContext>();
            builder.UseMySql(connectionString,
                             mysqlOptions =>
                             {
                                //遷移的時候,會報sql語法錯誤,遷移sql指令碼應該是按照最新的api生成的,在舊版本資料庫中不兼
                                 mysqlOptions.ServerVersion(new Version(5, 0, 96), ServerType.MySql); 
                             }
                            );

            return new AppDbContext(builder.Options);
        }
    }
}

注意看裡面的註釋

遇到的其他問題

1.“DesignTimeDbContextFactory”類的示例是放在表示層,我要移植到“DbContext”同一層

2.移植過後“ConfigurationBuilder”無法點出“SetBasePath”方法,猜測是web層的引用擴渣的(這裡我先不讀取配置檔案,直接寫死連線字串了

3.配置過後成功的生成了遷移檔案,如下圖;但是在更新資料庫的時候失敗了,大概是報了sql語法錯誤,原因是我的mysql的版本是5.x.x,生成的sql語句應該是最新版本(猜測),在github找到“Pomelo.EntityFrameworkCore.MySql”文件,發現了一個很好的配置,就是資料庫版本

mysqlOptions.ServerVersion(new Version(5, 0, 96), ServerType.MySql);   //不用看這裡,上面有完整的


最後附上我的

##初始化
dotnet ef migrations add [<The name of the migration>] -s ../tz.web
dotnet ef migrations add zq1 -s ../tz.web

##更新資料庫
dotnet ef database update -s ../tz.web

其中 [../tz.web]應該是../tz.web “startup專案的位置”,需要DesignTimeDbContextFactory來建立dbcontext

假設你的DesignTimeDbContextFactory在web層,DbContext在其他層,那麼就需要上面的-s,如果不是則省略-s

執行命令需要前往DbContext層執行哦