傳送門
以前在上海做了一段時間的Asp.net,基本用的都是.net自帶的EF框架連接數據庫,不過都是用的Model First,最近開了個項目,我就先把數據層,搭建了下,用的Code First,用起來要比Model First繁瑣一點。今天來一起走一遍這個讓我踩了幾個雷的Code First.
2.EF框架已經添加到Nuget管理器中,可以在Nuget管理器命令行中輸入"install-package entityframework"添加EF框架的依賴。默認項目一定要選對
由於我已經安裝過,所以就提示依賴已存在
3.在對應的項目的配置文件中(如類庫的默認配置文件就是"App.config")添加數據庫連接字符串節點。
4.新建一個項目的數據上下文類(大概就是類似於內存中的數據庫上下文),繼承DbContext類,將初始化字符串傳到父類的構造,后期遷移也是通過此字符串傳入到父類中,進行數據庫連接的實例化。重寫父類的方法:
5.開始建立實體類,建立實體基類BaseEntity,建立一些通用的屬性,比如Id,CreateTime等
public class BaseEntity { public virtual Guid Id { get; set; } = new Guid();//id public virtual DateTime CreateTime { get; set; } = DateTime.Now;//數據創建時間 public virtual bool IsRemove { get; set; } }
繼續建立自己所需的派生類,需要自己做好非空注解,外鍵注解等數據約束。
namespace StudentSys.Models { public class Student:BaseEntity { [Required]//非空約束 public string Name { get; set; } public string Sex { get; set; } public DateTime BornDate { get; set; } public string QQ { get; set; } public string Phone { get; set; } public string Email { get; set; } public string ImagePath { get; set; } [ForeignKey(nameof(Class))]//外鍵約束 public Guid? ClassId { get; set; } public Class Class{ get; set; } } }
6.建立好這些實體類之后,就要去數據上下文類中進行注冊,表示這些類都對應一個數據庫中一張表,用DbSet集合作為屬性類型,映射后當作內存中存放數據表中的數據。
7.做好這些准備工作之后,也就代表你的代碼段的模型已經建立完成了,需要向數據庫端進行遷移,打開Nuget管理器控制台按照以下流程輸入命令。
(1)控制台輸入 PM> Enable-Migrations 如果出現黃色的提示,則跳轉下一步,報錯,請到文章末尾查看報錯類型和解決方案。成功項目中會多一個Migrations目錄
(2)繼續輸入“add-migration createdb”,注意createdb可由咱們自行定義。此時Migrations目錄中生成了一個名字很長的cs文件,可以看到其為咱們創建數據表的代碼,ef對枚舉、復雜類型、實體繼承都提供了非常棒的知識,我們此時可以修改相應代碼以生成我們希望看到的表結構。類名就是我們剛剛輸入的名字。此時還沒有和數據庫端有任何關系,可以把這個類當作數據庫的建庫腳本,我們最后一步其實就是將這個類轉化為sql語句然后在Sql Server中運行。
(3)最后一步輸"update-database",就是對遠程數據端進行更改了。不報錯則操作成功。
8.打開數據庫,就能看到生成的數據庫和數據表已經存在了。
(1)提示”EntityType 'XXX' has no key defined“。
解決辦法:這是因為這里需要你所有的實體類都要指定主鍵,所以你的每個類要么有一個Id的屬性要么有一個屬性上面有[key]特性的標識。我這里是把Id定義在基類中。
(2)提示”System.Data.SqlClient.SqlException (0x80131904): 在與 SQL Server 建立連接時出現與網絡相關的或特定於實例的錯誤。未找到或無法訪問服務器。請驗證實例名稱是否正確並且 SQL Server 已配置為允許遠程連接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服務器/實例時出錯)“
解決辦法:
(1)查看服務中的對應數據庫實例是否開啟
(2)網絡配置中把TCP/IP選項打開,然后選中TCP/IP,右擊屬性,將所有的地址都啟用
(3) 查看Sql Server數據庫屬性中,允許遠程是否已經被打開。嘗試在服務配置管理中,將服務登陸賬號修改為"內置賬號",選擇"Local System"。
(4)以上還不行的話,卸載本地數據庫
(5)以上還不行的話,終極辦法!!!在確保連接字符串正確的前提下,將連接字符串復制到DbContext的構造方法中。因為我觀察到如果傳入配置文件中連接字符串節點的key到這個構造的話,之后報錯的連接字符串要比我的這個多了一個單詞。如下就能成功解決上面的問題,至於原因還未知,希望大佬知道的話可以解惑,萬分感謝。