Entity Framework part2
EF原理
以XML方式打開edmx文件,這個XML的文件主要包含兩大部分:Runtime是類模型部分,Designer是VS中的圖形界面
重點討論的是Runtime部分,又分為三大部分:
SSDL數據模型部分
CSDL概念模型部分
C-S Mapping映射規則部分
畫圖演示ORM與edmx中的對應關系
根據映射關系和實體狀態完成sql的生成
Entity Framework 利用了抽象化數據結構的方式,將每個數據庫對象都轉換成應用程序對象 (entity),而數據字段都轉換為屬性 (property),關系則轉換為結合屬性 (association),讓數據庫的 E/R 模型完全的轉成對象模型,如此讓程序設計師能用最熟悉的編程語言來調用訪問。而在抽象化的結構之下,則是高度集成與對應結構的概念層、對應層和儲存層,以及支持 Entity Framework 的數據提供者 (provider),讓數據訪問的工作得以順利與完整的進行。
概念層E:負責向上的對象與屬性顯露與訪問
對應層M:將上方的概念層和底下的儲存層的數據結構對應在一起。
儲存層D:依不同數據庫與數據結構,而顯露出實體的數據結構體,和 Provider 一起,負責實際對數據庫的訪問和 SQL 的產生
EF中操作數據庫的網關:上下文
ObjectContext封裝 .NET Framework 和數據庫之間的連接。此類用作“創建”、“讀取”、“更新”和“刪除”操作的網關。
ObjectContext 類為主類,用于與作為對象(這些對象為 EDM 中定義的實體類型的實例)的數據進行交互。
ObjectContext 類的實例封裝以下內容:
到數據庫的連接,以 EntityConnection 對象的形式封裝。
描述該模型的元數據,以 MetadataWorkspace 對象的形式封裝
用于管理緩存中持久保存的對象的 ObjectStateManager 對象
注意:在EF4.0之前的版本中都是EF訪問數據庫的入口是ObjectContext。而在EF4.1之后的版本中最新的數據庫訪問上下文的入口改成了DbContext。本質上來說:DbContext繼承了ObjectContext類,所以新版本中不能直接使用ObjectContext里面的方法和屬性等,但基本底層的東西還是一致的。
?
EF相比Ado.Net的優點
極大的提高開發效率,EF是微軟自己的產品,跟VS開發工具集成度比較好,開發中代碼都是強類型的,寫代碼效率非常高,自動化程序非常高,命令式的編程
EF提供的模型設計器非常強大,不僅僅帶來了設計數據庫的革命,也附帶來的自動化生成模型代碼的功能也極大的提高開發和架構設計的效率
EF跨數據庫支持是ORM框架主要功能點之一,帶來的可以是通過僅僅改變配置就可以做到跨數據庫的能力
缺陷:性能差(生成sql腳本階段),在復雜查詢的時候生成的sql腳本效率不是很高
EF相對Ado.Net的缺點
問1:EF性能好不好呢?
答1:不好,性能有損耗
問2:損耗在哪里呢?
答3:數據庫端性能損耗是一樣的;損消耗在將對象狀態轉換為SQL語句時損失性能,但是更換數據庫是非常方便的
Model First
在項目一開始,沒有數據庫時,可以借助EF設計模型,然后根據模型同步,完成數據庫中表的創建,這就是ModelFirst開發方式
示例:創建模型BookInfo、BookType
屬性的類型:
這里的類型都是CTS中的類型,即IL中使用的類型
Int32
String,可以選擇是否采用Unicode編碼,如果采用則對應著sql server中的nvarchar類型
Decimal,表示指定小數位數及數據精度的類型,范圍表示小數個數,精度顯示總的數據位數
屬性“可以為Null”
屬性“實體鍵”:表示設置主鍵
關聯:
1:1性能低(不會延遲加載,添加時必須同時創建兩個對象),不要使用,可以自己實現邏輯代碼完成這種操作,可以查看一下表結構,本質還是1:m的結構
1:m
m:n:可以手動創建中間表采用1:m關系,也可以直接使用此種關系,EF會自動創建中間表
在創建關聯時,可以選擇是否要創建導航屬性、外鍵
導航屬性
根據關系的不同,查看生成的導航屬性的類型
示例:1對多關系中,對于多端表數據的插入
方法SaveChange():執行所有的命令樹,會采用事物機制執行
同步
從數據庫更新模型
根據模型生成數據庫:刪除表后再創建表,會導致表中原有數據丟失;建議手動修改表結構
CodeFirst
對于已經存在了模型類型的項目,怎么使用EF呢?Code first,也叫POCO+Code Only
code only,顧名思義,只需要代碼不需要Edmx模型,EF提供了通過類型的結構推斷生成Sql并創建數據庫中的表,而且能夠通過類型的成員推斷出實體間的關系的功能,開發人員只需要編寫實體類就可以進行EF對數據庫的開發
優勢:開發更進一步簡潔化。開發效率又一次提高。自動化程度進一步提高。可以適用于原有的老項目
劣勢:性能不怎么好。了解的人比較少
引入程序集EntityFramework,System.Data.Entity
在配置文件中寫連接字符串
創建模型類(如果項目中已經有模型類,則只需要維護關系)
通過導航屬性來表示類的關系,注意:導航屬性設置成virtual,可以實現延遲加載
特性維護:Table,Key,ForeignKey
創建上下文類,繼承自DbContext
調用父類構造方法,傳遞連接字符串"name=***"
根據類型創建數據庫表
使用context.Database.CreateIfNotExists()完成數據庫中表的創建
調用context.SaveChanges()方法完成保存
關鍵:上下文,實體類的約束及關系
使用EF與MVC的三層
?
轉載于:https://www.cnblogs.com/CSharpLover/p/6115713.html
總結
以上是生活随笔為你收集整理的Entity Framework part2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初步认识kafka
- 下一篇: Spring事务管理Transactio