SlideShare a Scribd company logo
Entity Framework實戰
大綱
 ORM/OAM
 Entity Framework介紹
 EF的三種開發模式
 實體模型設計器
 CRUD
 EF6的新功能
 Repository/Unit Of Work模式
 效能考量
ORM
 解決物件導向與關聯式資料庫阻抗不匹
配的問題。
 它就像是物件導向系統中的虛擬資料庫。
ORM帶來的好處
 加速開發
◦ 避開不純熟的SQL造成效能低落
 降低開發時程
◦ 減少重覆資料處理初始化程式碼
 降低開發成本
◦ 得到物件導向開發的優點
 兼容各品牌的關聯式資料庫
◦ 各品牌資料庫的完成的SQL標準程度不一,
並且有自己的客製化。
ORM的缺點
 效能不佳
 無法直接控制SQL語法
OAM?
 ORM的R字母代表的是Relational,其指
的是關聯式資料庫。
 關聯式資料庫是儲存資料的一種方式,
但不是全部情境都適用。
 OAM的A字母代表的是: Any!
近代資料存取
SQL
NoSQL
依資料特性寫到適合
的資料儲存系統
依資料特性從適合的
資料儲存系統取出
SQL與NoSQL之間已不再是零和遊戲
Entity Framework介紹
 Entity Framework是微軟公司自行開發
的一套ORM框架,目前已將源始碼開放
出來了。
 Entity Framework目前常以EF縮寫代替。
 Entity Framework是奠基於ADO.Net
2.0 Provider模型之上。
EF應用上的概觀圖
EF內部細節的概觀圖
操作EF的方式
 Linq/E-SQL
中繼資料工作區
物件中繼資料
(O-工作區)
概念性結構描述
(C-工作區)
儲存結構描述
(S-工作區)
CSDL
MSL
SSDL
C-S
的對應
O-C
的對應
用戶檢視引擎
物件服務
EntityClient資料提供者
ADO.Net資料提供者
E-SQL LinQ IEnumerable<T>
E-SQL CCT DataReader
•EntityConnection
•EntityCommand
•ExecuteReader
•ObjectContext
•ObjectQuery<T>
•資料類別
•EntityConnection
•EntityCommand
•ExecuteReader
ADO.Net 2.0
E-SQL CCT DataReader
結構描述
 CSDL
◦ 概念模型;主要是偏向物件導向系統的觀點
 MSL
◦ 對映概念上定義的項目與實體儲存的項目
 SSDL
◦ 實體儲存模型;與實際上使用的儲存系統所
使用的資料定義較貼近
用戶檢視引擎
(Client View Engine)
 當MSL編譯過後會產生出一個查詢/更
新檢視。
 用戶檢視引擎會使用這些檢視來正反兩
個方向轉換開發人員定義的概念性結構
與實體儲存結構。
(其實就是一個Parser+Converter)
物件服務(Object Service)層
 為開發人員簡化物件在記憶體中變更的
追蹤。(利用ObjectStateManager)
 簡化將變更存回到資料庫的過程。
 物件服務接收ESQL/Linq並將標準命令
樹(CCT)所產生的運算式傳遞給
EntityClient執行。
EF的三種開發模式
 資料庫先行
 模型先行
 程式碼先行(Existing Db)
新DB
舊DB
Model First
• 使用實體設計工具建立模型
• DB是依模型建構而成
• POCO也是依模型產生
Code First(新DB)
• 使用類別來對應資料表
• DB是依類別建構而成
• 使用Migration來演化DB
Database First
• 使用實體設計工具以逆向工
程的方式建立模型
• POCO依模型自動產生
Code First(舊DB)
• 使用類別來對應資料表
• 可使用逆向工程的工具
來輔助建立POCO
DataBase First建立步驟(1)
 利用實體模型建立精靈建立實體模型
DataBase First建立步驟(2)
 選擇由資料庫產生
DataBase First建立步驟(3)
 建立連線字串
DataBase First建立步驟(4)
 確認產生的連線字串與組態設定
DataBase First建立步驟(5)
 選取要映射的資料庫項目
實體模型設計器
模型關聯圖
對應詳細資料
模型瀏覽器
專有名詞
 實體(Entity)
 複雜型別
(Complexity Type)
 列舉(Enum)
 關聯(Relation)
 函式(Function)
 容器(Containter)
實體(Entity)
 類別: 物件的藍圖,亦是一般性觀點。
 實體: 具有商業邏輯和系統資訊的物件,
並且可被識別。
複雜型別
 用於函數/預存程序的輸出/入參數。
 物件導向觀點中的:
◦ Use
◦ 聚合
列舉
 整數型欄位的值域限制
函數
 資料庫中宣告的函數或預存程序
容器(Container)
 依特定存取規則有組織地儲存其它物件。
 容器的三個要點:
◦ 存取
◦ 儲存
◦ 檢索
MetaData檔案
如何檢示MetaData
如何自動產生POCO?
 T4(Text Template
Transformation
Toolkit)
 一個文字範本,在範
本中可以透過程式
碼與邏輯來決定要
嵌入那些文字。
組態
 connectionStrings
 entityFramework
◦ defaultConnectionFa
ctory
 provider
App.config的內容
組態:
DefaultConnectionFactory
 當組態檔中沒有設定連線字串時,EF會
自動使用指定的
DefaultConnectionFactory
 若沒有設定連線字串也沒有設定
DefaultConnectionFactory,則使用程式
碼優先開發(Code First)會自動套用:
組態:Provider
 組態有兩個重要的參數:
◦ InvariantName: Provider的唯一識別名稱
◦ Type: Provider組件的完整命名空間
CRUD
 Entity Framework的Container已經封裝
了許多資料存取上的細節,讓資料存取
的操作變得單純。
新增Customer
 新增操作有兩個要
點:
◦ 實體的Add方法
◦ 容器的SaveChange
方法
檢索Customer相關資料
 檢索所使用的是
Linq的API,需熟悉
Linq操作才能瞭解
如何正確取得所需
要的資料。
更新Customer
 更新的處理極其簡
單,其原因是Entity
Framework會自動
追蹤實體是否有被
修改,只要任一屬性
被異動馬上會被查
覺,當呼叫
SaveChange時,會
自動更新資料庫中
資料。
刪除Customer
 刪除實體與新增實
體的作法極其類似,
唯一差別僅在呼叫
的容器方法
為:Remove;除此之
外,在最後仍是需要
呼叫容器的
SaveChange方法
來提交變更。
CRUD的Pitfull
 DateTime的預設值
 資料欄位預設值
 不同的SQL Server版本
 逾時
 甲租乙還
 局部更新
DateTime的預設值
 .Net系統的DateTime型別與資料庫的
型別對應是DateTime2。
 若資料表設定是使用DateTime,則需要
在程式中特別設定DateTime型別的屬
性值,否則會引發Exception。
資料欄位預設值
若沒有特別指定,則無法套用預設值
SQL Server版本不同
當正式環境與測試環境的資料庫版本不同
時, 需調整SSDL中的
ProviderManifestToken屬性的值。
範例: 若是SQL Server 2005版本,則直接修改值為2005
甲租乙還
 由於Container具有
追蹤的特性,若甲容
器的實體沒有切斷
連結就在乙容器中
進行存取操作,會發
生例外。
甲
乙
僅更新某個欄位
 欲指定某個欄位更新,可針對對該實體的
IsModifed屬性設定為true即可。
EF6增加的新功能
 EF6大幅提升效能,與過去不同的是,視
圖引擎不再是隨需產生,而是事先產生
再鏈結,如此一來減少了暖啟動時間。
EF6中較大的更新
 支援Async/Await模式
 基於程式碼的組態設定
 連線的可適性
 攔截器
 重覆使用同一個Connection物件
 重覆使用同一個交易物件
 提供批次新增/刪除的方法
提供Async/Await模式
基於程式碼的組態設定
 擺脫過去組態設定
的束縛,讓組態設定
可以自由化。
連線的可適性
 提供四種處理連線不穩定的策略:
◦ DefaultExcutingStrategy(預設)
◦ DefaultSqlExcutionStrategy
◦ DbExecutionStrategy
◦ SqlAcureExecutionStrategry
設定連線策略
欄截器
攔截器的方法
方法 意義 ADO.Net對應方法
NonQueryExecuting 在執行資料異動前被呼叫 ExecuteNonQuery
NonQueryExecuted 在執行資料異動後被呼叫 ExecuteNonQuery
ReaderExecuting 在執行查詢前被呼叫 ExecuteReader
ReaderExecuted 在執行查詢後被呼叫 ExecuteReader
ScalarExecuting 在執行單物件查詢前被呼叫 ExecuteScalar
ScalarExecuted 在執行單物件查詢後被呼叫 ExecuteScalar
藉由攔截器來實現OAM-
從Nuget安裝套件
藉由攔截器來實現OAM-
宣告Log類別
藉由攔截器來實現OAM-
撰寫Interceptor
藉由攔截器來實現OAM-
Interceptor的建構子
藉由攔截器來實現OAM-
NonQueryExecuted實做
藉由攔截器來實現OAM-
容器的建構子中註冊Interceptor
從MongoDb觀察紀錄
重覆使用同一個連線物件
舊版的Entity Framework在SaveChanges之後就會關閉連線,但現在
已經可以重覆開啟與關閉。
重覆使用同一個交易物件
重用已開啟的連線/交易物件
 實務上,有可能會需要重用連線與交易
物件。
 通常會應用在跨資料庫的分散式交易。
調整容器的建構子
分散式交易
批次新增/刪除
Repository樣式
 Repository一如其名:倉儲。其目的在於
封裝資料存取的細節。
 Repository實做上多會搭配介面以利各
種物件導向操作。
繼承與封裝
 Repository的目的就在於封裝,其封裝的
程度依系統的複雜度而定。
 在經過一段時間後可以發現到系統存取
的通用方法,至此可以考慮抽象化並將
通用方法取出。
常用到的方法
方法 輸入參數 意義
GetAll 無 取得全部資料
GetBy PK欄位 依PK取得資料
Insert 實體 新增
AddRange 實體集合 批次新增
Update 實體 更新
Delete 實體 刪除
DeleteBy PK欄位 依PK刪除
RemoveRange 實體集合 批次刪除
Filter Lambda陳述式 篩選多筆資料
OrderBy Lambda描述式 排序資料
GetWithPagig 啟,迄 分頁
Repository介面
一般操作介面
查詢介面
Repository實做-
建構子
Repository實做-
GetAll屬性
以屬性的方式操作GetAll其優點在於可以省去打小括弧。
Repository實做-
GetBy
DbSet此型別所提供的Find方法極為強大;當容器中已存在指定的
實體時,Find方法會直接從容器取出而不會連線到資料庫下命令,如
此一來便能大幅減少效能的損耗。
Repository實做-
Insert/AddRange
新增方面的操作都相對簡單
Repository實做-
Update
更新的處理重點在於Attach這個部份,其餘相對簡單
Repository實做-
刪除
刪除的操作多樣性比較高,
故,需要使用到三個API。
RepositoryQuery實做-
Filter/OrderBy
RepositoryQuery實做-
GetWithPaging方法
許多頁面呈現的部份會需要
使用到分頁處理的功能。
Repository的特化
宣告特化的介面,此介面是用來延伸和特殊化針對Customer這個實體
的Repository
實務操作-
複雜查詢
運用IRepositoryQuery的API可以組合出所需要的查詢內容。
Master-Detail的資料處理
 在關聯式資料處理中最常也是最麻煩的
莫過於Master-Detail的資料處理。
 單靠Repository無法處理這個問題,需要
有一個統一個介面來處理。
UnitOfWork的介面
UnitOfWork的介面僅只有兩個最重要的方法:
•SaveChanges
•儲存所有資料異動
•Repository
•檢索需要的Repository
UnitOfWork實做-
建構子
UnitOfWork實做-
介面方法實做
UnitOfWork實務
Entity Framework效能議題
 Entity Framework是以一種物件導向的
思維在思考物件狀態的保持,其思考領
域迥異於過去資料庫儲存程式。
 Entity Framework畢竟是ORM,當然會
帶有ORM與生俱來的效能議題。
預編譯的View
 Entity Framework允許將View預先編譯
並載入,藉此降低初始化Context的所需
時間。
 可以使用EF Power Tool來完成此項功
能。
預編譯的View實做
產生出預編譯View之後再重建整個專案,即可擁有預編譯的效能提升效果
利用Ngen提升效能
 EF6支援Ngen。
 Ngen是一套用來將組件直接轉譯成原
生碼(Native Image)的工具。
 Native Image帶來的優點:
◦ 節省記憶體空間
◦ 降低應用程式啟動時間
Native Image對於記憶體的改善
 當有多個Process都使用同一個組件時,
若此組件可藉由Ngen產出Native
Image,則僅需載入一份Native Image即
可。
Native Image對於應用程式啟動
的改善
 當有多個應用程式都使用到同一個組件
時,若該組件可以被Ngen產出Native
Image,則當第一個應用程式啟動完成後,
接下來的應用程式都不需要重覆載入。
NativeImage
移至路徑
產生Img
節制分散式交易
 分散式交易對於系統效能來說一直是個
隱憂;對於ORM來說,其傷害更甚。
修改同筆資料的連線控制
 同筆資料的修改以物件導向的思考僅需
在物件身上操作即可,不需每一次異動
都更新資料庫。
(X) (O)
只取需要的資料
 查詢資料時,記得要下條件式只取得所
需要的資料。
 在查詢時以Where篩選資料。
 取得資料時可以考慮Select的資料是以
匿名類別取得。
考量是否需要追蹤
 容器一旦取得實體後就會進行追蹤,但
是不是每個操作都會需要對取得的實體
進行追蹤;例如一些資料顯示的操作。
 IQueryable介面提供AsNotracking
正確的更新/刪除資料
 更新/刪除資料可以採用Attach的方式
將實體放入容器中,不需要從資料庫中
取出指定實體再修改/刪除。
Native SQL的適用時機
 當處理批次更新或是欲自主控制SQL查
詢陳述句,可以考慮使用Native SQL。
 EF6提供SqlQuery的方法可以將SQL陳
述句字串投入。
Eager v.s. Lazy
 共有四種模式:
◦ Explicit Eager Loading
◦ Eager Loading
◦ Explicit Lazy Loading
◦ Lazy Loading
Eager和Explicit Eager Loading
 Eager Loading:
◦ 在第一次撈取資料的時候就把Reference的
所有資料也一併載入。
 Explicit Loading:
◦ 第一次撈取資料時並不直接也撈取
Reference的資料;當到了要操作Reference
資料時呼叫API顯示載入Reference資料。
Lazy和Explicit Lazy Loading
 Lazy Loading:
◦ 當需要使用到Reference資料時才自動載入。
 Explicit Lazy Loading:
◦ 當關閉了Entity Framework的Lazy Loading
功能後,可以顯示呼叫API設定Lazy
Loading。
Eager/Explicit Eager Loading
Eager Loading
Explicit
Eager Loading
Lazy和Explicit Lazy Loading
Lazy Loading
Explicit Lazy
Loading
Eager與Lazy的選擇
 Eager是提前將Reference的實體載入
到記憶體中,雖然可以節省與資料庫的
來回時間,但卻會增加容器首次操作的
資源耗用。
 Lazy是待需要使用到Reference實體的
時候才會去資料庫取得資料,相較Eager
來說可以在某種程度上降低資源耗用,
但會增加資料庫來回時間。
Proxy物件
 Entity Framework為了達成下兩個目的
而自動為實體建立一個Proxy物件:
◦ 變更追蹤
◦ Lazy Loading
產出Proxy物件的基本條件
 實體類別的存取子需為Public
 實體類別不可宣告為sealed
 實體類別不可宣告為abstract
 實體類別需有一個public或protected的預
設建構子
 實體類別不得實做
IEntityWithChangeTracker或
IEntityWithRelationships介面
 容器的ProxyCreationEnabled屬性需設定
為true
產出Lazy Loading Proxy的條件
 實體的導覽屬性其存取子需宣告為
public virtual
 導覽屬性的get運算子不得宣告為
sealed
產生Change Tracking Proxy的條
件
 每一個屬性的存取子都需宣告為
public virtual
 每一個屬性都不可宣告為sealed
 若導覽屬性是表達many的,其型別需為
實做ICollection<T>的資料型別
Proxy物件的問題
 EF創建Proxy物件會損耗系統資源,但
它可以協助追蹤屬性變更並且可以提供
Lazy Loading。
(前題是實體類別的宣告要符合條件)
繼承的架構規劃
 共有三種規劃:
◦ TPH(Table Per Hierarchy)
◦ TPC(Table Per Class)
◦ TPT(Table Per Type)
TPH(Table Per Hierarchy)
 資料庫中僅有一張表,該張表擁有所有
子類別的欄位,並使用一個欄位來區分
TPC(Table Per Class)
 資料庫僅有子類別的表, 父類別的欄位
會重置在子類別的表中。(PK要能同步)
TPT(Table Per Type)
 每個類別都有自己的資料表,子類別將
父類別的PK作為自己的外鍵。

More Related Content

PDF
系統程式 -- 第 3 章
PDF
系統程式 -- 第 8 章
PPTX
Lecture 4 нийлмэл удамшил
PDF
effective modern c++ chapeter36
DOCX
系統程式 -- 第 4 章 組譯器
PDF
系統程式 -- 第 6 章
PDF
Tqc+程式語言Python-第0章
系統程式 -- 第 3 章
系統程式 -- 第 8 章
Lecture 4 нийлмэл удамшил
effective modern c++ chapeter36
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 6 章
Tqc+程式語言Python-第0章

What's hot (20)

PPT
Pp Lect5
DOC
Registered nurse in the Medical Surgical Department -ممرض(ة) مجاز(ة) في قسم ا...
PPT
مراقبة جودة تسجيلات مارك 21 الببليوجرافية / إعداد محمد عبدالحميد معوض
PPTX
TQC+ 程式語言 Python 09:檔案處理
PPTX
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
PDF
系統程式 -- 第 10 章
PPT
Function points analysis
PPTX
مختصر الكتابة العلمية2- التوثيق
PPTX
TQC+ 程式語言 Python 08:字串處理
PPT
005 өгөгдлийн нөөцийн удирдлага
PPTX
C# 8.0 null許容参照型
PPTX
UEFIによるELFバイナリの起動
PPTX
Creating Domain Specific Languages in F#
PPTX
U.cs101 алгоритм программчлал-12
DOCX
系統程式 -- 第 8 章 編譯器
PPTX
Мэдээллийн системийг хөгжүүлэх
PPTX
الإعتمادية الأكاديمية - المؤسسي والبرامجي.pptx
PDF
مناهج البحث العلمي - شرح الوحدات 1-5
DOCX
系統程式 -- 第 3 章 組合語言
PPTX
ضمان الجودة في التعليم
Pp Lect5
Registered nurse in the Medical Surgical Department -ممرض(ة) مجاز(ة) في قسم ا...
مراقبة جودة تسجيلات مارك 21 الببليوجرافية / إعداد محمد عبدالحميد معوض
TQC+ 程式語言 Python 09:檔案處理
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
系統程式 -- 第 10 章
Function points analysis
مختصر الكتابة العلمية2- التوثيق
TQC+ 程式語言 Python 08:字串處理
005 өгөгдлийн нөөцийн удирдлага
C# 8.0 null許容参照型
UEFIによるELFバイナリの起動
Creating Domain Specific Languages in F#
U.cs101 алгоритм программчлал-12
系統程式 -- 第 8 章 編譯器
Мэдээллийн системийг хөгжүүлэх
الإعتمادية الأكاديمية - المؤسسي والبرامجي.pptx
مناهج البحث العلمي - شرح الوحدات 1-5
系統程式 -- 第 3 章 組合語言
ضمان الجودة في التعليم
Ad

Viewers also liked (16)

PDF
Entity framework 與 LINQ
PDF
Entity framework 入門第一課
PPTX
Team Foundation Server
PPTX
Linq實戰
PPTX
Linq初階
PPTX
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
PDF
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
PPTX
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
PPTX
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
PDF
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
PPTX
Asp.net mvc 概觀介紹
PPTX
Entity framework + Linq 介紹
PPTX
ASP.NET MVC Performance
PPTX
保哥線上講堂:LINQ 快速上手
PPT
Mvc architecture
PPTX
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
Entity framework 與 LINQ
Entity framework 入門第一課
Team Foundation Server
Linq實戰
Linq初階
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練1
2015 年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Asp.net mvc 概觀介紹
Entity framework + Linq 介紹
ASP.NET MVC Performance
保哥線上講堂:LINQ 快速上手
Mvc architecture
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練6
Ad

Similar to Entity Framework實戰 (20)

PPT
Oracle北大青鸟完全教程
PDF
Sql Alchemy Story
PDF
Asp.net mvc網站的從無到有
PPT
網站設計100步
PPT
Struts Mitac(1)
PDF
Yii2 restful 基礎教學
PPT
信息系统开发平台OpenExpressApp
PPTX
1, OCP - architecture intro
PPT
Struts学习笔记
PDF
Oracle服务器及存储介绍
PPTX
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
PDF
Itpub电子杂志第四期第二稿
PPT
Oracle数据库体系结构简介.ppt
PPT
通过Struts构建Web应用
PDF
资身Dba经验谈
PDF
Kid171 chap03 traditional Chinese Version
PPTX
Code guidelines
PPT
数据库性能诊断的七种武器
PDF
MySQL5.6&5.7 Cluster 7.3 Review
DOC
中远公司 Java培训资料
Oracle北大青鸟完全教程
Sql Alchemy Story
Asp.net mvc網站的從無到有
網站設計100步
Struts Mitac(1)
Yii2 restful 基礎教學
信息系统开发平台OpenExpressApp
1, OCP - architecture intro
Struts学习笔记
Oracle服务器及存储介绍
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
Itpub电子杂志第四期第二稿
Oracle数据库体系结构简介.ppt
通过Struts构建Web应用
资身Dba经验谈
Kid171 chap03 traditional Chinese Version
Code guidelines
数据库性能诊断的七种武器
MySQL5.6&5.7 Cluster 7.3 Review
中远公司 Java培训资料

More from 國昭 張 (20)

PPTX
8th ddd taiwan study group bounded context integration
PPTX
Ddd(meetup 2) ddd with clean architecture
PPTX
20190126 ddd-meetup1
PPTX
事件風暴-設計衝刺
PPTX
事件風暴-領域建模
PPTX
單元測試
PPTX
Docker實務
PPTX
Scrum essential
PPTX
Docker進階探討
PPTX
PPTX
Docker基礎
PPTX
DDD架構設計
PPTX
DDD系統分析
PPTX
DDD引導
PPTX
前端測試
PPTX
Asp.net core v1.0
PPTX
Redux+react js
PPTX
React js
PPTX
架構設計-資料存取的選擇
PPTX
前端自動化工具
8th ddd taiwan study group bounded context integration
Ddd(meetup 2) ddd with clean architecture
20190126 ddd-meetup1
事件風暴-設計衝刺
事件風暴-領域建模
單元測試
Docker實務
Scrum essential
Docker進階探討
Docker基礎
DDD架構設計
DDD系統分析
DDD引導
前端測試
Asp.net core v1.0
Redux+react js
React js
架構設計-資料存取的選擇
前端自動化工具

Entity Framework實戰