1. 程式人生 > 實用技巧 >Entity Framework 實體資料模型——Code First

Entity Framework 實體資料模型——Code First

    之前大致總結了下EF 設計器的概念和實戰操作,接下來來總結下 Code First 構建的實體資料模型。

  EF 設計器建立實體資料模型檔案(.emdx)整合 Entity Framework,並通過 DBContext 和 DbSet 類來實現支援資料庫功能的開發,

  然而實體資料模型的構建與維護並不容易,難以應付開發大型的商業應用所需。因此,Entity Framework 在後續版本推出了Code First

  開發模式,以相對簡單明瞭的類設計取代了EF 設計器構建的實體資料模型檔案(.emdx)。

  一、傳統資料類物件

    Code First 通過典型的傳統類物件(Plain Old ClassObject,POCO)對映到資料結構,簡化了 EF 的開發過程,開發人員

    只需建立DbContext 和 DbSet 繼承的物件,EF 會自動處理其中的轉換細節。與 EF 設計器 相比,Code First 只保留了原來

    edmx實體資料模型檔案中的 DBContext、DbSet派生檔案。

    無論是從資料庫生成模型,還是從模型建立資料庫,EF 一旦確認DbSet 物件屬性與數字表欄位結構間的對映正確,便會自動

    維護資料查詢變動等的相關操作。

  二、建立專案

    建立一個控制檯應用程式的專案,專案名稱為:CodeFirstProject

    

    然後選擇專案 ==> 單擊滑鼠右鍵 ==> 選擇 管理NuGet程式包 ==> 選擇 瀏覽 頁籤 ==> 在搜尋框輸入回車搜尋 ==> 點選 安裝

    動態圖在這兒:

    

    接著在專案中新增一個名為 Model 的資料夾,並在該資料夾中新增兩個類檔案:Student.cs 和 StudentInfoModel.cs 。

    

    Student 類中定義以下屬性:

      public class Student
      {
          public int Id { get; set; }
          public string Name { get; set; }
          public int Age { get; set; }
          public bool
Sex { get; set; } public string Hobby { get; set; } public DateTime Birthday { get; set; } public decimal Tuition { get; set; } }

    StudentInfoModel 類需要繼承 DbContext,並定義 Students 屬性:

      using System.Data.Entity;

      namespace CodeFirstProject.Model
      {
          public class StudentInfoModel : DbContext  //繼承了 DbContext  
          {
              public DbSet<Student> Students { get; set; }
          }
      }

    接下來,我們需要在Main 方法中例項化StudentInfoModel,並獲取 Students 屬性的總數:

      using CodeFirstProject.Model;
      using System;
      using System.Linq;

      namespace CodeFirstProject
      {
          class Program
          {
              static void Main(string[] args)
              {
                  StudentInfoModel stuModel = new StudentInfoModel();
                  int stuCount = stuModel.Students.Count();
                  Console.WriteLine(stuCount);
                  Console.Read();
              }
          }
      }

    第一次執行程式時,SQL Express 會自動建立名為CodeFirstProject.Model.StudentInfoModel 的資料庫,

    並建立了 Student 表,結構由 Student 類檔案中配置的屬性決定。我們可以通過 "SQL Server 物件資源管理器"(可在 檢視 選單下找到)

    來檢視程式自動生成的資料庫:

    

    我們可以通過檢視資料庫的屬性,來找到程式建立的資料庫所在的目錄:

    選中資料庫 ==> 單擊滑鼠右鍵 ==> 屬性

    

    資料庫連線:

    如果不在StudentInfoModel 類中指定資料庫的連線資訊,SQL Express 將會建立所需的資料庫。

    而在實際開發中,通常我們會通過連線字串的設定來自行建立所需的資料庫。

    首先,我們需要在StudentInfoModel 類中新增一個建構函式,並配置資料庫的連線名稱:

      using System.Data.Entity;
      namespace CodeFirstProject.Model
      {
          public class StudentInfoModel : DbContext
          {
        
              public StudentInfoModel() : base("name=StuInfoModelConnection") //新增建構函式,並配置資料庫的連線名稱
              {

              }

              public DbSet<Student> Students { get; set; }
          }
      }

    其次開啟App.config 檔案,在configuration 節點中新增如下內容:

      <connectionStrings>
            <!--DataDirectory 表示資料庫路徑的替換字串。-->
            <add name="StuInfoModelConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;
                                        AttachDbFilename=|DataDirectory|CodeFirstProjectModel.mdf;                                         Integrated Security=True;Connect Timeout=30;
                                        MultipleActiveResultSets=True;App=EntityFramework"

                                        providerName
="System.Data.SqlClient"/> </connectionStrings>

    第三步,在專案的 \bin\Debug 目錄下建立資料庫檔案:

    

    特別注意:App.config 中配置的資料庫名稱,需要和建立時的資料庫名稱保持一致哦!!!

    

    最後,可以通過新增現有項的方式,把資料庫拷貝到專案的根目錄:

    

    App.config 檔案的連線配置也要相應的調整下,才能使用根目錄中的資料庫檔案喲!

      <connectionStrings>
            <!--將 AttachDbFilename=|DataDirectory|CodeFirstProjectModel.mdf; 這個配置替換成 
          Initial Catalog=CodeFirstProjectModel; 這個就好了!
--> <add name="StuInfoModelConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;                                         Initial Catalog=CodeFirstProjectModel;                                         Integrated Security=True;Connect Timeout=30;
                                        MultipleActiveResultSets=True;App=EntityFramework"

                                        providerName
="System.Data.SqlClient"/> </connectionStrings>

    好了,在空白專案中使用 Code First 建立程式, EF 會自動完成其中與資料庫的互動細節。

    與 EF 設計器相比,Code First 直接採用類取代 EMD 檔案,內容更為簡潔,而實體類與資料庫

    底層資料結構的對映設定由慣例原則、屬性標記以及 Fluent API 等程式設定的方式來取代 XML

    格式的 SSDL、CSDL與MSL設定。