最近專案中用到了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的函式,延遲函式也可能引用主函式用於返回的變數,...