emmm,原本想着用Core作一個小項目玩玩的,而後確定是要用到數據庫的,html
而後想,啊,要不用CodeFirst,感受很膩害的樣子,因而,一臉天真無邪的我就踏入了一個深不見底的天坑。。。web
原本想着,應該不是很難,多百度就好,辣麼多大神都寫了教程,數據庫
零零散散的花了將近三個星期時間,照着Demo寫了N屢次的我,不得不放棄了掙扎,ide
邀請了一位一塊兒工做的大佬,看着他噼裏啪啦調試了半個小時以後,就出現的數據庫,莫名心塞,工具
大佬就是大佬,原諒小弟我才疏學淺,因此作一個筆記先,留着備用。。ui
我會邊寫博客,邊作一個最簡單的Demo,其實不少時候咱們缺的,就是這些入門級的東西,spa
那些加了各類驗證和功能的代碼,反而會影響咱們找到須要的代碼。設計
工具:VS20173d
環境:.Net Core 2.0 ,EF7調試
這些建好以後的項目結構,應該是醬紫的
網上看了好多方法,基本是都是使用工具=>NuGet包管理=>程序包管理控制檯,來添加依賴,大概是醬紫:
能夠先開着,待會兒用得着,不過我覺着這樣有點麻煩,因此直接寫在項目的工程文件(*.csproj)裏面去了,要寫的代碼以下
1 <ItemGroup> 2 <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.1" /> 3 <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.1" /> 4 </ItemGroup>
保存以後,Models的EF依賴就已經加入了,怎麼知道是否成功呢?看這裏,,,
之前是隻有一個SDK的,如今多了個NuGet,裏面還有倆東西,並且沒有警告啊那些亂七八糟的東西,就表示沒問題了,,
一樣的,咱們爲WebFront項目,也加上依賴,,這裏就不截圖了,,,
走到這一步,咱們就應該開始建立數據庫的上下文和數據表了
建立數據庫的上下文類(DBCodeFirst)和數據表類(DT_User),結構以下
DBCodeFirst的內容以下:
1 public class DBCoreFirst : DbContext 2 { 3 public DBCoreFirst() : base() 4 { 5 6 } 7 8 public DBCoreFirst(DbContextOptions<DBCoreFirst> options) 9 : base(options) 10 { 11 12 } 13 14 override protected void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 15 { 16 base.OnConfiguring(optionsBuilder); 17 } 18 19 #region 數據表 20 21 public DbSet<DT_User> DT_User { get; set; } 22 23 #endregion 24 25 }
DT_User的內容以下:
1 public class DT_User 2 { 3 /// <summary> 4 /// 默認int類型ID爲主鍵 5 /// 必須有一個字段爲主鍵,否則會報錯 6 /// </summary> 7 public int ID { get; set; } 8 public string UserName { get; set; } 9 }
而後在WebFornt項目的Startup類的ConfigureServices方法中寫一段代碼,鏈接字符串中的DataBase寫的數據庫名稱是啥,生成的數據庫名稱就是啥,能夠和你的上下文類名稱不一致
這時候,咱們再來看看數據庫的狀況,是沒有DBCodeFirst這個庫的
打開它,輸入命令,Add-Migration *****(這塊兒隨意)
1 Add-Migration DBCoreFirst
在執行它的時候,我報了好幾個錯,一一列舉出來
第一個報錯
GenericArguments[0], 'Models.Migrations.DBCoreFirst', on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.
genericarguments [ 0 ],」模型。遷移。dbcorefirst ','微軟。entityframeworkcore。設計。idesigntimedbcontextfactory ` 1 [ tcontext ]「違背類型的tcontext約束。
這個報錯的鍋在圖中,我用紅框框起來的地方,默認項目 ,對,沒錯,就是它,應該改爲WebFonrt,
改好以後,咱們繼續執行Add-Migration DBCoreFirst
緊接着,報了第二個錯
Could not load assembly 'WebFront'. Ensure it is referenced by the startup project 'Models'. 未能加載程序集「webfront」。確保它由啓動項目的「Models」引用。
這個報錯的鍋呢,看到我箭頭的尾部了麼,在哪裏?是Models項目吧,如今這個項目是加粗的,表示它是啓動項目,
更改啓動項目爲WebFornt項目,很好,第二個坑被我填了,繼續運行Add-Migration DBCoreFirst
第三個坑接踵而至
Your target project 'WebFront' doesn't match your migrations assembly 'Models'. Either change your target project or change your migrations assembly. 你的目標項目webfront不遷移組件模型匹配」。要麼更改目標項目,要麼更改遷移程序集。
其實這個坑也不算大,強行往下走也是能生成數據庫的,可是,對我這個強迫症來講,哪裏容得下飄紅??
因而百度,查看了相關資料後,我知道問題出在了哪裏,就是箭頭尾部的第28行代碼
services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(connection)); 改成 services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(connection, c => c.MigrationsAssembly("WebFront")));
很好,沒有飄紅了,但是,在圖中黃色框中,會對應的生成一些文件,
按個人理解,這些文件不是什麼日誌文件,就是用來數據表映射的,因此,這些文件應該出如今Models中,而不是WebFront
一系類百度後,,好像沒找着,只能本身點點點,
發現了第四個坑
首先,將代碼還原,
services.AddDbContext<DBCoreFirst>(options => options.UseSqlServer(conStr));不變
而後咱們回到第一個坑,將默認項目從「WebFront」改成「Models」
而後執行Add-Migration DBCoreFirst
很穩,如今四個地方都對了,而後咱們看看數據庫,這個時候尚未生成對應的庫
而後,幸運的我又遇到了第五個坑
GenericArguments[0], 'Models.Migrations.DBCoreFirst', on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'. genericarguments [ 0 ],」模型。遷移。dbcorefirst ','微軟。entityframeworkcore。 設計。idesigntimedbcontextfactory ` 1 [ tcontext ]「違背類型的tcontext約束。
打開一個由命令生成的文件看看
兩個類的名稱一毛同樣,數據庫又是根據DBCodeFirst這個類來生成的,不出問題就見鬼了,,
那麼,左邊的類名爲何會和右邊的同樣??
問題在於咱們執行的「Add-Migration DBCoedFirst「命令
Add-Migration DBCodeFirst 改成 Add-Migration DBLog
執行以後的效果,很明顯的變了
緊接着,執行命令「Update-DataBase」
而後,咱們去數據庫看看
很穩,數據庫生成了,EF會自動生成__EFMigrationsHistory表,好像是用來記錄數據遷移日誌的,我們如今忽略就好
至此,EF7的CodeFirst生成數據庫就完成了,,
自我感受,寫完這一篇,我打馬賽克的技術也愈來愈穩了,,,