03 ORM簡介 - wycmaker/MVC-learning GitHub Wiki
ORM(Object Relational Mapping),中文為物件關係對映,是將關聯式資料庫映射到物件導向的資料抽象化技術,讓程式開發人員以物件的方式對資料庫進行操作,而不是用SQL語法進行操作,可以降低物件導向程式與資料庫的耦合關係。
- 優點
-
以物件導向程式設計的概念進行資料庫的操作
-
用同一套語法可以對不同關聯式資料庫進行操作,可以減少學習的負擔
-
自動產生SQL語法,可以確保一定的效能與安全性
-
可以防止SQL injection
-
提升轉移資料庫的方便性,只需更改對應關係即可,不須對模型進行更改
- 缺點
-
因為有「將程式語言轉換成SQL語法」的步驟,與傳統直接寫SQL語法相比,效能較差
-
對於初學者而言,學習難度較高
-
對於跨多個資料表的複雜查詢,除了ORM語法,還需加入SQL語法,降低程式的維護性
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檔中取得。
在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