EF框架之——Code First以及踩過的這些“坑”


傳送門

  Code First使用步驟

  Code First報錯和解決辦法

 

 

 

 

以前在上海做了一段時間的Asp.net,基本用的都是.net自帶的EF框架連接數據庫,不過都是用的Model First,最近開了個項目,我就先把數據層,搭建了下,用的Code First,用起來要比Model First繁瑣一點。今天來一起走一遍這個讓我踩了幾個雷的Code First.

1.建立類庫項目,用來存放我們定義的映射數據表的實體類。

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到這個構造的話,之后報錯的連接字符串要比我的這個多了一個單詞。如下就能成功解決上面的問題,至於原因還未知,希望大佬知道的話可以解惑,萬分感謝。

 

 

 

 

 

 

 

 

 

  

 


免責聲明!

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



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