asp.net core 2.1 Mysql 資料庫遷移,遇坑記錄
阿新 • • 發佈:2019-01-22
首先來一段錯誤
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層執行哦