.Net Core建站(1):EF Core+CodeFirst数据库生成
emmm,本來想著用Core做一個小項目玩玩的,然后肯定是要用到數據庫的,
然后想,啊,要不用CodeFirst,感覺很膩害的樣子,于是,一臉天真無邪的我就踏入了一個深不見底的天坑。。。
?
本來想著,應該不是很難,多百度就好,辣么多大神都寫了教程,
零零散散的花了將近三個星期時間,照著Demo寫了N多次的我,不得不放棄了掙扎,
邀請了一位一起工作的大佬,看著他噼里啪啦調試了半個小時之后,就出現的數據庫,莫名心塞,
大佬就是大佬,原諒小弟我才疏學淺,所以做一個筆記先,留著備用。。
?
我會邊寫博客,邊做一個最簡單的Demo,其實很多時候我們缺的,就是這些入門級的東西,
那些加了各種驗證和功能的代碼,反而會影響我們找到需要的代碼。
?
工具:VS2017
環境:.Net Core 2.0 ,EF7
?
首先,我們需要的是建一個解決方案,一個類庫項目,以及一個Web項目
這些建好之后的項目結構,應該是醬紫的
建好之后,就到了一個小關鍵了,我們要添加EF的依賴了,怎么添加呢?
網上看了好多方法,基本是都是使用工具=>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
很穩,現在四個地方都對了,然后我們看看數據庫,這個時候還沒有生成對應的庫
然后我們執行第二段命令Update-DataBase
然后,幸運的我又遇到了第五個坑
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生成數據庫就完成了,,
自我感覺,寫完這一篇,我打馬賽克的技術也越來越穩了,,,
?
轉載于:https://www.cnblogs.com/Onlooker/p/8047176.html
總結
以上是生活随笔為你收集整理的.Net Core建站(1):EF Core+CodeFirst数据库生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 正则表达式格式化时间显示
- 下一篇: 897A. Scarborough Fa