EF原理剖析一 如何實現ORM

2021-08-21 17:09:18 字數 3259 閱讀 7588

最近專案中用到了ef,初次接觸,使用了基本的增刪改查。而對於ef底層的原理,卻沒有了解的透徹。俗話說,知其然,還要知其所以然。

注意:orm框架採用元資料來描述物件一關係對映細節,元資料一般採用xml格式,並且存放在專門的物件一對映檔案中。只要提供了持久化類與表的對映關係,orm框架在執行時就能參照對映檔案的資訊,把物件持久化到資料庫中

ef是通過xml的方式實現對映的。這裡採用dbfirst的方式生成ef實體模型,即model1.edmx.使用xml編輯器開啟,如圖:

分為三層:儲存層ssdl、概念層csdl、對映層c-s

儲存層ssdl**示例:

"model1.store" provider="oracle.manageddataaccess.client" providermanifesttoken="12.1"

alias="self" xmlns:store="" xmlns:customannotation="" xmlns="">

"deptinfo">

"deptinfono" />

type="varchar2" maxlength="32" nullable="false" />

type="varchar2" maxlength="32" />

type="number" precision="38" scale="0" />

type="varchar2" maxlength="32" />

type="varchar2" maxlength="24" />

type="varchar2" maxlength="24" />

type="varchar2" maxlength="255" />

存放資料庫中表中字段資訊(名稱、型別、長度、精度範圍等),與資料庫內容一致

概念層csdl**示例:

namespace="model1"

alias="self"

annotation:usestrongspatialtypes="false"

xmlns:annotation=""

xmlns:customannotation=""

xmlns="">

name="deptinfo">

name="deptinfono" />

key>

name="deptinfono"

type="string"

maxlength="32"

fixedlength="false"

unicode="false"

nullable="false" />

name="deptname"

type="string"

maxlength="32"

fixedlength="false"

unicode="false" />

name="deptnumber"

type="decimal"

precision="38"

scale="0" />

name="deptboss"

type="string"

maxlength="32"

fixedlength="false"

unicode="false" />

name="deptreserve1"

type="string"

maxlength="24"

fixedlength="false"

unicode="false" />

name="deptreserve2"

type="string"

maxlength="24"

fixedlength="false"

unicode="false" />

name="deptdesc"

type="string"

maxlength="255"

fixedlength="false"

unicode="false" />

name="safeguardplan"

relationship="self.fk_sgp_deptinfono"

fromrole="deptinfo"

torole="safeguardplan" />

name="squadroninfo"

relationship="self.fk_squad_deptinfono"

fromrole="deptinfo"

torole="squadroninfo" />

entitytype>

name="deviceinfo">

存放對映之後類中屬性資訊(名稱、型別、最大長度、精度範圍等),與c#類用法保持一致

c-s對映層**示例:

space="c-s"

storageentitycontainer="model1storecontainer"

cdmentitycontainer="entities1">

name="deptinfo">

typename="model1.deptinfo">

storeentityset="deptinfo">

name="deptinfono"

columnname="deptinfono" />

name="deptname"

columnname="deptname" />

name="deptnumber"

columnname="deptnumber" />

name="deptboss"

columnname="deptboss" />

name="deptreserve1"

columnname="deptreserve1" />

name="deptreserve2"

columnname="deptreserve2" />

name="deptdesc"

columnname="deptdesc" />

c-s對映層是ef的核心,是將儲存層ssdl中的表資訊與概念層cdsl的類資訊對應對映。

接下針對每一層的核心內容一一分析。

步步深入EF(一) EF原理

一 什麼是ef?實體架構 entity framework 是微軟以來 ado.net 為基礎開發出來的物件關係對映 orm 解決方案,它解決了物件持久化問題,將程式設計師從編寫麻煩的 sql語句中解放出來。優點 支援多種資料庫 microsoft sql server oracle 和db2 等 ...

Go slice實現原理剖析

slice又稱動態陣列,依託陣列實現,可以方便的進行擴容 傳遞等,實際使用中比陣列更靈活。正因為靈活,如果不了解其內部實現機制,有可能遭遇莫名的異常現象。slice的實現原理很簡單,本節試圖根據真實的使用場景,在原始碼中總結實現原理。按照慣例,我們開始前先看幾段 用於檢測對slice的理解程度。下面...

Go defer實現原理剖析

defer語句用於延遲函式的呼叫,每次defer都會把乙個函式壓入棧中,函式返回前再把延遲的函式取出並執行。為了方便描述,我們把建立defer的函式稱為主函式,defer語句後面的函式稱為延遲函式。延遲函式可能有輸入引數,這些引數可能 於定義defer的函式,延遲函式也可能引用主函式用於返回的變數,...