.Net Core建站(1):EF Core+CodeFirst數據庫生成

emmm,原本想着用Core作一個小項目玩玩的,而後確定是要用到數據庫的,html

而後想,啊,要不用CodeFirst,感受很膩害的樣子,因而,一臉天真無邪的我就踏入了一個深不見底的天坑。。。web

 

原本想着,應該不是很難,多百度就好,辣麼多大神都寫了教程,數據庫

零零散散的花了將近三個星期時間,照着Demo寫了N屢次的我,不得不放棄了掙扎,ide

邀請了一位一塊兒工做的大佬,看着他噼裏啪啦調試了半個小時以後,就出現的數據庫,莫名心塞,工具

大佬就是大佬,原諒小弟我才疏學淺,因此作一個筆記先,留着備用。。ui

 

我會邊寫博客,邊作一個最簡單的Demo,其實不少時候咱們缺的,就是這些入門級的東西,spa

那些加了各類驗證和功能的代碼,反而會影響咱們找到須要的代碼。設計

 

工具:VS20173d

環境:.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生成數據庫就完成了,,

自我感受,寫完這一篇,我打馬賽克的技術也愈來愈穩了,,,

相關文章
相關標籤/搜索