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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM