ORM系列之Entity FrameWork详解
一. 談情懷
? 從第一次接觸開發(fā)到現(xiàn)在(2018年),大約有六年時(shí)間了,最初階段連接數(shù)據(jù)庫,使用的是【SQL語句+ADO.NET】,那時(shí)候,什么存儲過程、什么事務(wù) 統(tǒng)統(tǒng)不理解,生硬的將SQL語句傳入SQLHelper類中,后來知道還要注意SQL注入,引入?yún)?shù)化的方式,現(xiàn)在回想一下,那個(gè)階段簡直Low到爆。
(PS:現(xiàn)在很多場景下還是需要使用ADO.NET,所以沒有最好,只有最適合)
? ? ? ?凡事都是從零開始的,正是這個(gè)階段積累,才有了后續(xù)的發(fā)展。一次機(jī)會,接觸到了微軟的EF(ps:如果沒有記錯(cuò)的話,當(dāng)時(shí)用的是EF 5.0 的DBFirst模式),徹底顛覆了我的開發(fā)觀念,不需要寫SQL語句(那時(shí)還不清楚EF也可以調(diào)用SQL語句),Lambda表達(dá)式(并不知道Lambda還分Lambda表達(dá)式和Lambda語句),興奮了一陣,然后進(jìn)入了漫長的EF摸索和填坑階段了(EF5.0→EF6.2→EF Core)。
? 如果你覺得EF不靈活,不能調(diào)用存儲過程或自定義事務(wù)?如果你覺得EF在處理海量數(shù)據(jù)庫的時(shí)候會很慢?如果你覺得EF滿足不了你的開發(fā)需求?。。。。。。 那么也許該系列的文章會對你有些幫助。
二. ORM框架
說起DotNet領(lǐng)域的ORM框架,我們想到的有EF、NHibernate、FluentData、Dapper、SQLSugar等等。那么到底什么是ORM呢?
? ORM(Object Relational Mapping),中文名字:對象關(guān)系映射,它是面向?qū)ο笏枷氲倪M(jìn)一步的發(fā)揚(yáng)光大,主要實(shí)現(xiàn)【程序?qū)ο蟆康健娟P(guān)系型數(shù)據(jù)庫】的映射。在之前使用ADO.NET開發(fā)的時(shí)候,數(shù)據(jù)庫訪問層(即 DAL),要寫很多增加、刪除、保存的方法,很是麻煩,如果引入ORM框架,它自帶CRUD的API(相當(dāng)于DAL層已經(jīng)給你寫好了),可以自動(dòng)生成SQL語句,所以作為開發(fā)者而言,只需要關(guān)注對象即可。
?ORM的含義:
① O:Domain Object ?領(lǐng)域模型
② R:Relational DataBase 關(guān)系型數(shù)據(jù)庫
③ M : Mapping 映射關(guān)系
? ? ? ORM的三大核心原則:
① 簡單性:以最簡單的模式建模數(shù)據(jù)。
② 傳達(dá)性:數(shù)據(jù)庫結(jié)構(gòu)被任何人都能理解的語言文檔化。
? ? ? ?③ 精確性:基于數(shù)據(jù)模型創(chuàng)建正確標(biāo)準(zhǔn)化的結(jié)構(gòu)。
?
EF的核心架構(gòu):
?
?
? ① ?EDM(Entity Data Model):這是微軟提供的一個(gè)強(qiáng)大的可視化工具,用來生成 O、R、M的
② ?兩種語法的查詢:LINQ to Entities 和 Entity SQL
③ ObjectServices:Linq to Entities 和Entity Client Data Provider 之間起到轉(zhuǎn)換作用
④?Entity Client Data Provider: 將Lambda轉(zhuǎn)換成SQL語句
⑤ ADO.Net Data Provider: 標(biāo)準(zhǔn)的ADO.Net
⑥ DataBase:數(shù)據(jù)庫
?
三. 從EF的入手,深入理解ORM框架
? EF(Entity FrameWork),是微軟推出基于ADO.NET的數(shù)據(jù)庫訪問技術(shù),它是一套ORM框架, 框架中包括了實(shí)例模型、數(shù)據(jù)模型、關(guān)系映射三部分,EF的上下文為DbContext,EF在 【.Net FrameWork】版本中最新的是 6.2.0 版本,最穩(wěn)定的是6.2版本,在【.Net Core】中推出 EF Core (即所謂的“EF7”,^_^,當(dāng)然已經(jīng)不這么叫了)。
EF包括三種模式:DBFirst、CodeFist、ModelFirst 。EF可以調(diào)用SQL語句、可以使用Linq查詢、可以使用Lambda查詢,EF還有很多高級屬性,比如延遲加載、緩存屬性等等,在該系列文章中都將逐一詳細(xì)介紹。
EF也有優(yōu)缺點(diǎn):
優(yōu)點(diǎn):① ?EF是微軟自家的產(chǎn)品,和VS的集成度很高,極大的提高了開發(fā)效率。
? ② ?EF中ModelFirst模式提供的模型設(shè)計(jì)器功能很強(qiáng)大,且采用T4模板生成的代碼的功能很強(qiáng)大。
? ? ? ? ? ? ? ? ? ? ③ ?支持多數(shù)據(jù)庫開發(fā),簡單的改變配置文件,就可以切換數(shù)據(jù)庫。
? ? ? ? ??缺點(diǎn): 在復(fù)雜的查詢生成SQL腳本的效率不是很高,浪費(fèi)了性能。
? ? 舉例:之前在開發(fā)中,一張幼兒表里大約有60個(gè)字段左右,一個(gè)業(yè)務(wù)需要根據(jù)復(fù)雜的條件查詢出來一些信息(大約5個(gè)字段左右),當(dāng)時(shí)由于按開發(fā)人員的失誤,寫的Lambda表達(dá)式直接將所有字段查詢出來,導(dǎo)致該業(yè)務(wù)耗時(shí)很長大約25s左右,后來在我的引導(dǎo)下,先去數(shù)據(jù)庫中直接寫SQL語句,查詢所有字段,發(fā)現(xiàn)速度很快;然后將EF中的Lambda查詢改為只查詢指定的5個(gè)字段,發(fā)現(xiàn)速度由25s→3s左右,提升非常明顯,當(dāng)然這也很好的說明了EF的局限是在生成SQL的腳本效率上。
四. 系列章節(jié)
? ????? ?第一節(jié): 結(jié)合EF的本地緩存屬性來介紹【EF增刪改操作】的幾種形式。
? ? ? ? ?第二節(jié): 比較EF的Lambda查詢和Linq查詢寫法的區(qū)別。
? ? ? ? ?第三節(jié): EF調(diào)用普通SQL語句的兩類封裝(ExecuteSqlCommand和SqlQuery )??
? ? ? ? ?第四節(jié): EF調(diào)用存儲過程的通用寫法和DBFirst模式子類調(diào)用的特有寫法
? ? ? ? ?第五節(jié): EF高級屬性(一) 之 本地緩存、立即加載、延遲加載(不含導(dǎo)航屬性)
? ? ? ? ?第六節(jié): EF高級屬性(二)?之延遲加載、立即加載、顯式加載(含導(dǎo)航屬性)。
? ? ? ? ?第七節(jié): EF的三種事務(wù)的應(yīng)用場景和各自注意的問題(SaveChanges、DBContextTransaction、TransactionScope)。
? ? ? ? ?第八節(jié): EF的性能篇(一) 之 EF自有方法的性能測試? ?:
? ? ? ? ?第九節(jié): EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解決EF的性能問題? ?:
? ? ? ? ?第十節(jié): EF的三種追蹤實(shí)體屬性變化方式(DBEntityEntry、ChangeTracker、Local) ? ? :
? ? ? ? ?第十一節(jié): EF的三種模式(一) 之 DBFirst模式(SQLServer和MySQL兩套方案):
? ? ? ? ?第十二節(jié): EF的三種模式(二) 之 ModelFirst模式(SQLServer為例):
? ? ? ? ?第十三節(jié): EF的三種模式(三) 之 來自數(shù)據(jù)庫的CodeFirst模式? ? :
? ? ? ? ?第十四節(jié): EF的三種模式(四) 之 原生正宗的 CodeFirst模式的默認(rèn)約定? ?:
? ? ? ? ?第十五節(jié): EF的CodeFirst模式通過DataAnnotations修改默認(rèn)協(xié)定? ?:
? ? ? ? ?第十六節(jié): EF的CodeFirst模式通過Fluent API修改默認(rèn)協(xié)定? ?:
? ? ? ? ?第十七節(jié): EF的CodeFirst模式的四種初始化策略和通過Migration進(jìn)行數(shù)據(jù)的遷移? :
? ? ? ? ?第十八節(jié): EF的CodeFirst模式連接MySQL數(shù)據(jù)庫的解決方案(未完成)??:
? ? ? ? ?第十九節(jié): 結(jié)合【表達(dá)式目錄樹】來封裝EF的BaseDal層的方法?:
? ? ? ? ?第二十節(jié): 深入理解并發(fā)機(jī)制以及解決方案(鎖機(jī)制、EF自有機(jī)制、隊(duì)列模式等):
? ? ? ? ?第二十一節(jié):ADO層次上的海量數(shù)據(jù)處理方案(SqlBulkCopy類插入和更新):
? ? ? ? ?第二十二節(jié): 以SQLServer為例介紹數(shù)據(jù)庫自有的鎖機(jī)制(共享鎖、更新鎖、排它鎖等)和事務(wù)隔離級別? :
? ? ? ? ?第二十三節(jié): EF性能篇(三)之開源組件 Z.EntityFrameWork.Plus.EF6解決EF性能問題? ?:
? ? ? ? ?第二十四節(jié): ? ?:
? ? ? ? ?第二十五節(jié): ? ?:
?
?
? PS:EF Core 將單獨(dú)一個(gè)系列,敬請期待。。。。? ? ?該系列的EF后續(xù)將持續(xù)更新。
總結(jié)
以上是生活随笔為你收集整理的ORM系列之Entity FrameWork详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 油价“10元时代”引热议!航空煤油更离谱
- 下一篇: 四边等宽的Nothing Phone 1