03 ORM簡介 - wycmaker/MVC-learning GitHub Wiki

介紹

ORM(Object Relational Mapping),中文為物件關係對映,是將關聯式資料庫映射到物件導向的資料抽象化技術,讓程式開發人員以物件的方式對資料庫進行操作,而不是用SQL語法進行操作,可以降低物件導向程式與資料庫的耦合關係。

  • 優點
  1. 以物件導向程式設計的概念進行資料庫的操作

  2. 用同一套語法可以對不同關聯式資料庫進行操作,可以減少學習的負擔

  3. 自動產生SQL語法,可以確保一定的效能與安全性

  4. 可以防止SQL injection

  5. 提升轉移資料庫的方便性,只需更改對應關係即可,不須對模型進行更改

  • 缺點
  1. 因為有「將程式語言轉換成SQL語法」的步驟,與傳統直接寫SQL語法相比,效能較差

  2. 對於初學者而言,學習難度較高

  3. 對於跨多個資料表的複雜查詢,除了ORM語法,還需加入SQL語法,降低程式的維護性

Entity Framework介紹

Entity Framework是以ADO.NET為基礎的ORM架構,以Entity Data Model(EDM)為主,將資料邏輯層分為三層,以XML來表示。

  • 概念層結構:

    負責向上的物件與屬性顯露與存取,以CSDL(Conceptual Schema Definition Language)撰寫

    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="messageModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
        <EntityType Name="Article">
          <Key>
            <PropertyRef Name="Ttle" />
          </Key>
          <Property Name="Ttle" Type="String" MaxLength="20" FixedLength="true" Unicode="true" Nullable="false" />
          <Property Name="Content" Type="String" MaxLength="Max" FixedLength="false" Unicode="false" Nullable="false" />
          <Property Name="time" Type="DateTime" Nullable="false" Precision="3" />
          <Property Name="id" Type="Int32" Nullable="false" />
        </EntityType>
        <EntityContainer Name="messageEntities2" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="Article" EntityType="Self.Article" />
        </EntityContainer>
      </Schema>
    </edmx:ConceptualModels>
  • 對應層結構:

    將上方的概念層和底下的儲存層的資料結構對應在一起,以MSL(Mapping Specification Language)撰寫

<!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="messageModelStoreContainer" CdmEntityContainer="messageEntities2">
          <EntitySetMapping Name="Article">
            <EntityTypeMapping TypeName="messageModel.Article">
              <MappingFragment StoreEntitySet="Article">
                <ScalarProperty Name="id" ColumnName="id" />
                <ScalarProperty Name="Ttle" ColumnName="Ttle" />
                <ScalarProperty Name="Content" ColumnName="Content" />
                <ScalarProperty Name="time" ColumnName="time" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  • 儲存層結構:

    依不同資料庫與資料結構,而顯露出實體的資料結構體,和 Provider 一起,負責實際對資料庫的存取和 SQL 的產生,以SSDL(Storage Schema Definition Language)撰寫

<!-- SSDL content -->
    <edmx:StorageModels>
    <Schema Namespace="messageModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityType Name="Article">
          <Key>
            <PropertyRef Name="Ttle" />
          </Key>
          <Property Name="Ttle" Type="nchar" MaxLength="20" Nullable="false" />
          <Property Name="Content" Type="text" Nullable="false" />
          <Property Name="time" Type="datetime" Nullable="false" />
          <Property Name="id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
        </EntityType>
        <EntityContainer Name="messageModelStoreContainer">
          <EntitySet Name="Article" EntityType="Self.Article" Schema="dbo" store:Type="Tables" />
        </EntityContainer>
      </Schema></edmx:StorageModels>

以上的XML程式碼,是由Entity Framework中Database First方法產生的edmx檔中取得。

Entity Framework使用

在ASP.NET MVC中,Entity Framework的設計可以分為Model First、Database First、Code First三種。

  • Model First:透過Entity Framework的工具(EDMX設計介面)設計模型後再建立資料庫

實際使用範例:https://ithelp.ithome.com.tw/articles/10160947

  • Database First:由資料庫產生模型

實際使用範例:https://ithelp.ithome.com.tw/articles/10161127

  • Code first:使用程式碼定義模型後再建立資料庫

實際使用範例:https://ithelp.ithome.com.tw/articles/10160822


參考資料

ORM介紹及ORM優點、缺點:https://www.cnblogs.com/xiaowuzi/p/3485302.html

ORM VS SQL:https://dotblogs.com.tw/code6421/2009/02/10/7100

⚠️ **GitHub.com Fallback** ⚠️