EF噪窘、Dapper、NHibernate等ORM框架的比較及優(yōu)缺點(diǎn)

什么是ORM效扫?

ORM的全稱是Object Relational Mapping倔监,即對(duì)象關(guān)系映射。它的實(shí)現(xiàn)思想就是將關(guān)系數(shù)據(jù)庫(kù)中表的數(shù)據(jù)映射成為對(duì)象荡短,以對(duì)象的形式展現(xiàn)丐枉,這樣開(kāi)發(fā)人員就可以把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)這些對(duì)象的操作。因此它的目的是為了方便開(kāi)發(fā)人員以面向?qū)ο蟮乃枷雭?lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作掘托。

ORM實(shí)現(xiàn)原理

對(duì)象到數(shù)據(jù)庫(kù)的映射瘦锹; 對(duì)象與數(shù)據(jù)庫(kù)數(shù)據(jù)的互相轉(zhuǎn)換;

重量級(jí)ORM闪盔,

以EntityFramework弯院、NHibernate為代表

優(yōu)點(diǎn)?

面向?qū)ο蠓绞皆L問(wèn)數(shù)據(jù)庫(kù),擺脫SQL 可移植性強(qiáng)泪掀,支持所有流行的數(shù)據(jù)庫(kù) 面向接口的設(shè)計(jì)听绳,可擴(kuò)充性強(qiáng) 對(duì)事務(wù)、緩存(一級(jí)緩存)有良好的封裝及配置?

缺點(diǎn)?

比較復(fù)雜异赫,學(xué)習(xí)曲線大椅挣;?

處理對(duì)象關(guān)聯(lián)很容易出錯(cuò);

不適合統(tǒng)計(jì)查詢系統(tǒng)塔拳;

對(duì)于多表連查鼠证,復(fù)雜的sql實(shí)現(xiàn)比較復(fù)雜,而且有可能需要借助其他方案靠抑;?

自動(dòng)生成的sql查詢執(zhí)行效率低量九;?

對(duì)于大數(shù)據(jù)量、高負(fù)載場(chǎng)景需要慎重考慮颂碧;?

實(shí)現(xiàn)良好的二級(jí)緩存很困難荠列,并且只能定制;

輕量級(jí)ORM

以dapper為代表,并且是半自動(dòng)的载城。也就是說(shuō)實(shí)體類都要自己寫,Dapper相當(dāng)于Java里的Mybatis肌似。

優(yōu)點(diǎn):

1、開(kāi)源诉瓦、輕量锈嫩、小巧(單文件受楼,代碼就一個(gè)SqlMapper.cs文件,編譯后就40K的一個(gè)很小的Dll.)呼寸、上手容易。支持poco及動(dòng)態(tài)類型猴贰,縮寫詞:POCO's (plain old CLR objects)对雪。

2、支持的數(shù)據(jù)庫(kù)還蠻多的米绕,?Mysql,SqlLite,Sqlserver,Oracle等一系列的數(shù)據(jù)庫(kù)瑟捣。

3、執(zhí)行效率高栅干,Dapper的速度接近與IDataReader迈套,取列表的數(shù)據(jù)超過(guò)了DataTable。Dapper原理通過(guò)Emit反射IDataReader的序列隊(duì)列碱鳞,來(lái)快速的得到和產(chǎn)生對(duì)象桑李。

使用poco時(shí),屬性與數(shù)據(jù)庫(kù)表的映射無(wú)法靈活配置窿给,難以實(shí)現(xiàn)Repository模式


EF相對(duì)于ado.net 的優(yōu)點(diǎn)

1)開(kāi)發(fā)效率高贵白,Entity Framework的優(yōu)勢(shì)就是擁有更好的LINQ提供程序、文檔崩泡,并且是由微軟所支持的禁荒,用EntityFramework就是開(kāi)發(fā)速度快(當(dāng)然,那是在會(huì)linq的基礎(chǔ)上)角撞,智能感知(也是linq支持的結(jié)果)呛伴,通過(guò)實(shí)體、關(guān)系型數(shù)據(jù)庫(kù)表之間的映射谒所,使開(kāi)發(fā)人員可以通過(guò)操作表實(shí)體而間接的操作數(shù)據(jù)庫(kù),大大的減少了代碼量热康。不用定義實(shí)體類那些東西了。直接與數(shù)據(jù)庫(kù)中模型結(jié)合起來(lái)了,開(kāi)發(fā)人員完全可以根據(jù)面向?qū)ο蟮乃季S進(jìn)行軟件的開(kāi)發(fā)百炬。

2)可以使用三種設(shè)計(jì)模式中的ModelFirst來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)褐隆,而且比較直觀

3)可以跨數(shù)據(jù)庫(kù),只需要在配置文件中修改連接字符串

4)與vs結(jié)合的比較好

EF的缺點(diǎn)

EF的Context上下文不是線程安全的剖踊,你不應(yīng)該在整個(gè)Service上使用一個(gè)Context上下文庶弃。

EF的性能表現(xiàn)不太好,它的性能不如ADO德澈,開(kāi)發(fā)無(wú)法控制SQL語(yǔ)句的生成歇攻;頻繁插入操作(Insert)不適用, EF不支持大數(shù)據(jù)Bulk 插入

可維護(hù)性差,EF產(chǎn)生查詢梆造,他們是難以維護(hù)的缴守,它并不能很好地支持映射到不規(guī)范的表葬毫;它的概念模型,關(guān)系模型等全部都放在一個(gè)edmx文件里面屡穗,過(guò)于龐大贴捡,并不利于修改


NHibernate優(yōu)點(diǎn)和缺點(diǎn):

NHibernate優(yōu)點(diǎn):

1.完全的ORM框架。

NHibernate對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提供了較為完整的封裝村砂,它將數(shù)據(jù)庫(kù)模式映射為較完全的對(duì)象模型烂斋,支持封裝,繼續(xù)機(jī)制础废,功能較強(qiáng)大汛骂,比一般的ORM靈活性高。

開(kāi)發(fā)人員可以完全按照對(duì)象模型操縱數(shù)據(jù)庫(kù)评腺。

2.代碼自動(dòng)生成帘瞭,減少代碼和sql的開(kāi)發(fā)量,使開(kāi)發(fā)人員擺脫開(kāi)sql蒿讥,ado.net和事務(wù)蝶念,緩存等底層。

NHibernate的O/R Mapping實(shí)現(xiàn)了PO 和數(shù)據(jù)庫(kù)表之間的映射诈悍,以及SQL 的自動(dòng)生成和執(zhí)行祸轮。程序員往 往只需定義好了PO 到數(shù)據(jù)庫(kù)表的映射關(guān)系,即可通過(guò)NHibernate提供的方法完成持久層操作侥钳。程序員甚至不需要對(duì)SQL 的熟練把握适袜, NHibernate 會(huì)根據(jù)制定的存儲(chǔ)邏輯,自動(dòng)生成對(duì)應(yīng)的SQL 并調(diào)用ADO.NET接口加以執(zhí)行舷夺。NHibernate有工具可以直接根據(jù)數(shù)據(jù)庫(kù)模式生成po類苦酱,或者通過(guò)在代碼中添加Attribute屬性自動(dòng)生成 配置文件。

這些都減少了開(kāi)發(fā)工作量给猾。

3.較好的文檔支持疫萤。

NHibernate的代碼可讀性和文檔都比較好。

缺點(diǎn):

1.較復(fù)雜敢伸,學(xué)習(xí)曲線大扯饶。

2.對(duì)數(shù)據(jù)庫(kù)模式有較高的要求。NHibernate需要數(shù)據(jù)庫(kù)有良好的設(shè)計(jì)和比較完善的約束池颈。

3.不適合統(tǒng)計(jì)查詢系統(tǒng)尾序。對(duì)于多表連查,復(fù)雜的sql實(shí)現(xiàn)比較復(fù)雜躯砰,而且有可能需要借助其他方案每币。

4.需要一些xml配置。

------

ORM框架

1.NHibernate 一個(gè)傳統(tǒng)的ORM,移植于java的Hibernate,3.0后發(fā)展迅速,提供FluentMap和FluentConfig,支持Linq,支持HQL和NativeSQL,支持一級(jí)緩存和二級(jí)緩存,豐富的ID生成策略,更多的攔截事件暴露,支持常見(jiàn)的所有數(shù)據(jù)庫(kù),缺點(diǎn)就是配置選項(xiàng)有點(diǎn)多,初學(xué)者無(wú)處下手

2.EntityFramework 微軟官方出的ORM,配置簡(jiǎn)單,比NH更好的Linq支持,工具支持和較低的學(xué)習(xí)門檻,命名約定配置,支持CodeFirst DbMigration(在開(kāi)發(fā)時(shí),不能用在生產(chǎn)環(huán)境中),缺點(diǎn)就是不支持批量操作(第三方庫(kù)EntityFramework.Extension擴(kuò)展了這一點(diǎn),還做了緩存),無(wú)原生的二級(jí)緩存,,單調(diào)的ID生成方式,不支持多數(shù)據(jù)庫(kù)(很多數(shù)據(jù)庫(kù)如MySql都對(duì)EF提供了支持,但是bug多多,有穩(wěn)定的商業(yè)庫(kù)可以選擇),還有單一的配置方式(當(dāng)你想從程序集動(dòng)態(tài)加載model到DbContext中時(shí),你就會(huì)知道就多捉雞)

3.Dapper StackOverflow開(kāi)源的一個(gè)MiniOrm,性能和原生ado.net相近,0配置,強(qiáng)類型支持.缺點(diǎn)同樣是有小bug,較弱的LINQ支持(只找到一個(gè)MSSQL的linq插件)有兩個(gè)關(guān)于Dapper的擴(kuò)展,一個(gè)叫Dapper.Extension,一個(gè)叫Dapper.Rainbow.Mysql.這兩個(gè)擴(kuò)展可能更接近傳統(tǒng)意義上的ORM

4.ServiceStack.OrmLite 另外一個(gè)MiniORM,性能僅次于Dapper,支持大部分的數(shù)據(jù)庫(kù),比Dapper豐富的多的API和更好的強(qiáng)類型lambda表達(dá)式查詢條件支持,映射0配置,也支持以Attribute配置,支持表的創(chuàng)建和刪除

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琢歇,一起剝皮案震驚了整個(gè)濱河市兰怠,隨后出現(xiàn)的幾起案子梦鉴,更是在濱河造成了極大的恐慌,老刑警劉巖揭保,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肥橙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掖举,警方通過(guò)查閱死者的電腦和手機(jī)快骗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)塔次,“玉大人,你說(shuō)我怎么就攤上這事名秀±海” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵匕得,是天一觀的道長(zhǎng)继榆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汁掠,這世上最難降的妖魔是什么略吨? 我笑而不...
    開(kāi)封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮考阱,結(jié)果婚禮上翠忠,老公的妹妹穿的比我還像新娘。我一直安慰自己乞榨,他們只是感情好秽之,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吃既,像睡著了一般考榨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹦倚,一...
    開(kāi)封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天河质,我揣著相機(jī)與錄音,去河邊找鬼震叙。 笑死掀鹅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捐友。 我是一名探鬼主播淫半,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匣砖!你這毒婦竟也來(lái)了科吭?” 一聲冷哼從身側(cè)響起昏滴,我...
    開(kāi)封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎对人,沒(méi)想到半個(gè)月后谣殊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牺弄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年姻几,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片势告。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛇捌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咱台,到底是詐尸還是另有隱情络拌,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布回溺,位于F島的核電站春贸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遗遵。R本人自食惡果不足惜萍恕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望车要。 院中可真熱鬧允粤,春花似錦、人聲如沸屯蹦。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)登澜。三九已至阔挠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脑蠕,已是汗流浹背购撼。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谴仙,地道東北人迂求。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晃跺,于是被迫代替她去往敵國(guó)和親揩局。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容