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