Entity Framework - 資料模型檔案 EDMX

Entity Framework 透過  EDMX 檔案定義所需的資料模型,EDMX是一種副檔名為 .edmx 的檔案,包含三個部份 - CSDL、SSDL 與 C-S mapping ,在 XML 編輯視窗中屬於 EF Runtime content ,配置於 區塊中,在專案編之後,會形成三個獨立的檔案如下:

延伸檔名
.edmx 區塊
XXX.csdl
概念模型(CSDL
XXX.ssdl
儲存模型(SSDL
XXX.msl
對應(C-S mapping

在實際的設計架構中,這三者相互運作,提供低層資料來源與客戶端程式或是服務,透過 Entity Framework 進行資料存取所需的聯繫,如下圖:


另外, .edmx 檔案最下方有一個 EF Designer content 的區塊,配置於 <designer> ,這是視覺化工具 EF 設計師呈現模型圖像內容所需的資料,要避免手動修改其內容,否則將會導致工具開啟時的錯誤。

資料物件模型的操作與傳統的資料庫類似,必須定義底層資料來源的連線,接下來才透過指定的連線存取資料物件,也因此在建立實體資料模型的過程中,它會要求我們指定連線的名稱,在 建立實體資料模型的過程中,我們看到連線的設定如下:


對話方塊最下方提示 KTMSEntities 這個連線設定將儲存於 App.config 組態檔中,將其開啟畫面如下:


反白的部份為連線設定,連線字串內容如下:

<add
name="KTMSEntities"
connectionString="
metadata=
res://*/ModelKTMS.csdl|
res://*/ModelKTMS.ssdl|
res://*/ModelKTMS.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=TIM-PC;
initial catalog=KTMS;
integrated security=True;
MultipleActiveResultSets=True;
App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />

其中包含中繼資料、資料提供者、資料來源與連線的資料庫等相關資訊,比較需要注意的是地方,在於 metadata 指出了所需的資料模型檔案,其中的 * 表示相關的檔案嵌入專案的組件檔中,也就是Entity Framework 入門(4)- EDM 內容與編譯實體檔案這一篇提及的三個編譯實體檔案。

請特別注意連線字串為 KTMSEntities ,現在回到 初探 Entity Framework  這一篇,切換至專案清單畫面:


將 ModelKTMS.edmx 節點展開,底下有數個不同的檔案節點,進一步將 ModelKTMS.Context.tt ,將底下的 ModelKTMS.Context.cs 檔案開啟,其中是 KTMSEntities 類別定義:

namespace KTMS
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
   
    public partial class KTMSEntities : DbContext
    {
        public KTMSEntities()
            : base("name=KTMSEntities")
        {
        }   
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }   
       public DbSet<Categories> Categories { get; set; }
    }
}

KTMSEntities 繼承了 DbContext 類別,而 Categories 屬性回傳的則是 Categories 型態的 DbSet 類別,透過這些類別,我們因此可以撰寫相關的程式碼使用實體資料模型,讀者在這個專案的簡單示範中,亦見到了我們最後利用LINQ 語法存取其中的資料。DbContext 與 DbSet 是 Entity Framework 應用開發最重要的類別。

EDM 概念模型以邏輯實體容器管理實體集,就如同資料庫管理資料表,而DbContext底下的DbSet 則是對應至實體集。上述的 KTMSEntities 類別,其繼承 DbContext 的基礎建構式如下:

public KTMSEntities()
            : base("name=KTMSEntities")
{
}

其中指定了 name=KTMSEntities 參數為連線來源,因此當我們於 Program.cs 程式中建立 KTMSEntities 實體物件,即可透過組態檔的連線設定,分別調用 ModelKTMS.csdl 、 ModelKTMS.ssdl 以及 ModelKTMS.msl這三個檔案,並連接底層資料來源。

Entity Framework 有一套自己專屬的資料型態,開發人員必須瞭解這些型態與底層資料庫的型態對應,由於 Entity Framework 可以處理不同的資料來源,例如 Oracle 、 SQL Server 等等,因此在面對不同的底層資料庫來源時,瞭解特定資料庫對映的資料型態相當重要。在SqlClient for Entity FrameworkTypes 這個網頁,可以找到 SQL Server 專屬的型態對應列表如下:


接下來,我們會進行更多的 Entity Framework 討論,檢視各種資料模型內容,特別是後續的 Code First 模式開發,都會用到這裏的知識,這篇預先建立必要的概念。


沒有留言: