Entity Framework系統(tǒng)架構(gòu)與原理介紹
一、Entity Framework概要
Entity Framework是微軟的Object Relational Mapper(對(duì)象關(guān)系映射),也就是我們平常說(shuō)的ORM,它可以讓?xiě)?yīng)用程序開(kāi)發(fā)者將關(guān)系型數(shù)據(jù)作為業(yè)務(wù)模型來(lái)使用,也消除了開(kāi)發(fā)者為數(shù)據(jù)訪問(wèn)編寫(xiě)的絕大多數(shù)管道代碼的需要(比如使用ADO.NET)。Entity Framework提供了一個(gè)綜合的、基于模型的系統(tǒng),通過(guò)擺脫為所有的領(lǐng)域模型編寫(xiě)相似的數(shù)據(jù)訪問(wèn)代碼,使得開(kāi)發(fā)者創(chuàng)建數(shù)據(jù)訪問(wèn)層是如此之簡(jiǎn)單。Entity Framework的首發(fā)版本是EF3.5,是伴隨著.NET Framework 3.5 SP1和VS 2008 SP1一同發(fā)布的。從那之后,EF已經(jīng)進(jìn)化了很多很多,當(dāng)前版本是6.1.3。
Entity Framework通過(guò)開(kāi)啟數(shù)據(jù)訪問(wèn)和將數(shù)據(jù)表示為概念化模型(即一系列的實(shí)體類(lèi)和關(guān)系),減輕了創(chuàng)建數(shù)據(jù)訪問(wèn)層的任務(wù)。應(yīng)用程序可以執(zhí)行基本的CRUD(CRUD是指在做計(jì)算處理時(shí)的增加(Create)、查詢(xún)(Retrieve)(重新得到數(shù)據(jù))、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡(jiǎn)寫(xiě)。主要被用在描述軟件系統(tǒng)中數(shù)據(jù)庫(kù)或者持久層的基本操作功能。)操作,以及輕松地管理實(shí)體間的一對(duì)一、一對(duì)多和多對(duì)多關(guān)系。
EF是微軟主推的數(shù)據(jù)存取技術(shù),其他一些重要的微軟技術(shù)領(lǐng)域,比如ASP.NET MVC、WCF等,都使用EF構(gòu)建數(shù)據(jù)存取層。在實(shí)際開(kāi)發(fā)中,現(xiàn)在通常使用EF來(lái)構(gòu)建應(yīng)用程序的數(shù)據(jù)存取層。
二、使用Entity Framework的一些好處
因?yàn)殚_(kāi)發(fā)者不需要為數(shù)據(jù)訪問(wèn)編寫(xiě)所有需要的ADO.NET管道代碼(所謂管道代碼即創(chuàng)建數(shù)據(jù)庫(kù)連接、打開(kāi)數(shù)據(jù)庫(kù)、執(zhí)行查詢(xún)、返回?cái)?shù)據(jù)、關(guān)閉數(shù)據(jù)庫(kù)),因此可以節(jié)省很多開(kāi)發(fā)時(shí)間。
我們可以使用更高級(jí)的語(yǔ)言(例如C#)來(lái)編寫(xiě)所有的數(shù)據(jù)訪問(wèn)邏輯而不是編寫(xiě)SQL查詢(xún)和存儲(chǔ)過(guò)程。
因?yàn)閿?shù)據(jù)庫(kù)表沒(méi)有高級(jí)的關(guān)系(如繼承),然而實(shí)體是可以有的,所以業(yè)務(wù)模型(也就是概念模型)可以使用實(shí)體間的關(guān)系來(lái)適配應(yīng)用領(lǐng)域。
底層的數(shù)據(jù)存儲(chǔ)可以相對(duì)輕松地被取代,因?yàn)樗械臄?shù)據(jù)訪問(wèn)邏輯都呈現(xiàn)在應(yīng)用層而不是數(shù)據(jù)層。
- 開(kāi)源,且有足夠的資源投入,持續(xù)完善。
- 可以訪問(wèn)多種數(shù)據(jù)庫(kù)(如Oracle、DB2、MySQL等),但與SQL Server配合得最好。
- 更好地將應(yīng)用程序與數(shù)據(jù)庫(kù)結(jié)構(gòu)隔離開(kāi)了。
- 足夠靈活:支持三種開(kāi)發(fā)模式。
三、缺點(diǎn)
沒(méi)有原生編寫(xiě)的SQL語(yǔ)句執(zhí)行速度快。
四、EF的系統(tǒng)架構(gòu)與基本原理

從上圖中可以看出,EF在底層使用ADO.NET data provider,因此,它可以看成是對(duì)現(xiàn)有ADO.NET技術(shù)的一個(gè)“增強(qiáng)版”。
ADO.NET對(duì)數(shù)據(jù)庫(kù)存取引擎的封裝較少,因此,開(kāi)發(fā)效率不如EF,但性能有保證。
EF提供了更高層的抽象,開(kāi)發(fā)簡(jiǎn)單,使用靈活,但性能比直接使用ADO.NET會(huì)有損失(因?yàn)樗嗔艘粋€(gè)將LINQ查詢(xún)轉(zhuǎn)換為SQL命令的步驟)。
五、什么是ORM
幾乎所有的商業(yè)軟件都要存儲(chǔ)數(shù)據(jù),多年來(lái),Relational Database Management System(RDBMS)一直是開(kāi)發(fā)者尋求的數(shù)據(jù)存儲(chǔ)。ORM是允許開(kāi)發(fā)者使用面向?qū)ο蟮木幊陶Z(yǔ)言訪問(wèn)RDBMS數(shù)據(jù)的一系列技術(shù)??捎玫腞DBMS包括SQL Server, Oracle, DB2, MySQL等等。這些數(shù)據(jù)庫(kù)系統(tǒng)有一些共性。每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)都支持一個(gè)或多個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)都包含數(shù)據(jù)表,每個(gè)表都以表格的形式存儲(chǔ)數(shù)據(jù),并且被分成了列和行。多個(gè)表中的數(shù)據(jù)行可能相互關(guān)聯(lián)。比如,一個(gè)訂單Order表中的Id可能存儲(chǔ)在一個(gè)流水表Transaction中。
過(guò)去,在像EF這樣的工具出現(xiàn)之前,開(kāi)發(fā)者都是在軟件代碼內(nèi)部嵌套的sql語(yǔ)句,這是因?yàn)榫幊陶Z(yǔ)言不能原生理解Sql。比如,要從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),然后將結(jié)果作為對(duì)象操作,必須使用ADO.NET要寫(xiě)相當(dāng)數(shù)量的代碼才行。具體來(lái)說(shuō),先定義一個(gè)存儲(chǔ)person的類(lèi),然后打開(kāi)數(shù)據(jù)庫(kù)連接,創(chuàng)建具有查詢(xún)文本的命令,再執(zhí)行該命令的reader,然后對(duì)該reader的結(jié)果進(jìn)行迭代,最后再使用來(lái)自reader的數(shù)據(jù)填充Person類(lèi)的實(shí)例。你會(huì)看到,這里包含了很多步驟,而且更重要的是,這樣寫(xiě)的代碼維護(hù)成本很高。比如,數(shù)據(jù)庫(kù)中改了一個(gè)列名,這樣還要去代碼中進(jìn)行相應(yīng)更改,否則運(yùn)行時(shí)就會(huì)拋出異常。此外,我們數(shù)據(jù)庫(kù)中存儲(chǔ)的是標(biāo)量值數(shù)據(jù)(int,string等),但我們的目標(biāo)是一個(gè)對(duì)象或者對(duì)象圖。這樣看來(lái),這種訪問(wèn)數(shù)據(jù)的方式有很多問(wèn)題。
首先,RDBMS的列類(lèi)型和.Net類(lèi)型之間有類(lèi)型失配;其次,存儲(chǔ)和目標(biāo)之間也不匹配,前者是標(biāo)量值的集合,后者是具有屬性的對(duì)象。更糟糕的是,鍵入我們的person對(duì)象有一個(gè)更復(fù)雜的屬性List Phones,該屬性代表其他表的集合。這些問(wèn)題在OOP和關(guān)系數(shù)據(jù)庫(kù)中被稱(chēng)為“阻抗失配”(impedance mismatch)。
ORM這些工具出現(xiàn)的原因就是為了解決這種失配問(wèn)題。ORM工具將存儲(chǔ)在數(shù)據(jù)表中的數(shù)據(jù)表示為對(duì)象,這比起傳統(tǒng)的代碼有很多優(yōu)勢(shì):
它們使用原生.net類(lèi)型暴露數(shù)據(jù),使用簡(jiǎn)單的屬性暴露相關(guān)的數(shù)據(jù),提供編譯時(shí)檢查。
最后,在后面會(huì)看到,你會(huì)寫(xiě)更少的代碼。更少的代碼意味著更少的bugs,不是嗎?:)
六、Entity Framework簡(jiǎn)史
多年來(lái),有許多ORM工具進(jìn)入市場(chǎng),有開(kāi)源的,也有商業(yè)的。微軟也開(kāi)發(fā)了自己的ORM工具。第一個(gè)是內(nèi)置于.Net 3.5的LINQ to SQL。該ORM僅支持SQL Server和SQL Server Compact。2008年第一次發(fā)布的Entity Framework是第二次嘗試,相較于LINQ to SQL有很多優(yōu)點(diǎn)。首先,有自己的provider架構(gòu),因此對(duì)于所有的關(guān)系數(shù)據(jù)庫(kù)引擎都是開(kāi)放的,而不僅僅是SQL Server?,F(xiàn)在所有的主要RDBMS都有Entity Framework provider。
Entity Framework經(jīng)歷了很多版本。
第一版只支持Database First。這意味著你要將設(shè)計(jì)器指向一個(gè)已存在的數(shù)據(jù)庫(kù),然后就會(huì)生成一個(gè)包含數(shù)據(jù)庫(kù)和表抽象的代碼。除了代碼之外,還會(huì)創(chuàng)建一個(gè)EDMX文件,該XML文件包含了實(shí)體數(shù)據(jù)模型(因此你也就知道了EDMX的意思了Entity Data Model Xml)。它包括三個(gè)模型:邏輯,存儲(chǔ)和映射。邏輯模型(有時(shí)也叫概念模型)就是使用C#進(jìn)行編碼的那個(gè),存儲(chǔ)模型描述了數(shù)據(jù)是如何存儲(chǔ)到數(shù)據(jù)庫(kù)中的,映射模型提供了邏輯模型和存儲(chǔ)模型之間的映射。如果你在數(shù)據(jù)庫(kù)中更改了東西,那么你也要更新生成的模型,C#代碼也要再次生成。映射模型有一個(gè)基于ObjectContext的類(lèi),該類(lèi)有數(shù)據(jù)庫(kù)中每張表的集合屬性,每個(gè)集合都是一個(gè)泛型集合,集合中的元素類(lèi)型是從EF中的一個(gè)基類(lèi)中繼承的。每個(gè)類(lèi)都有屬性和相應(yīng)的數(shù)據(jù)表中的列對(duì)應(yīng)。
第二版,也就是EF4,也開(kāi)始支持Model-First了。這樣 ,我們就可以使用設(shè)計(jì)面板創(chuàng)建實(shí)體類(lèi),然后設(shè)計(jì)器會(huì)產(chǎn)成SQL腳本來(lái)生成數(shù)據(jù)庫(kù)。對(duì)于這種方法,仍會(huì)生成EDMX文件,最終的結(jié)果是和Database First是相同的。
最后,EF的Code First在版本4.1中引入。Code First不需要EDMX文件了,每個(gè)實(shí)體也不需要從EF的基類(lèi)中繼承了。這樣,代碼變得更加容易測(cè)試。這種方法也不需要依賴(lài)設(shè)計(jì)器了,你只需要編寫(xiě)類(lèi)就行,而且它們會(huì)自動(dòng)地映射到數(shù)據(jù)庫(kù)中的表。當(dāng)前的EF 6.1.3中的Code First已經(jīng)相當(dāng)強(qiáng)大了。
七、Entity Framework具有的潛力
EF對(duì)于微軟開(kāi)發(fā)者可以做很多事情。
首先,它可以將數(shù)據(jù)庫(kù)暴露成對(duì)象的集合,這是通過(guò)利用很多關(guān)鍵的類(lèi)完成的。前提是你要了解DbContext,這個(gè)類(lèi)是EF Code First的核心,在高層次上是數(shù)據(jù)庫(kù)抽象。數(shù)據(jù)庫(kù)包含了表,每個(gè)表又包含了行和列。DbContext有泛型集合屬性,每個(gè)屬性的類(lèi)型是DbSet<TRowType>對(duì)應(yīng)于每個(gè)表。集合中的每個(gè)對(duì)象指的是一個(gè)實(shí)體,代表相應(yīng)表中的一行。數(shù)據(jù)表中的列是定義在TRowType類(lèi)中的屬性。一旦這個(gè)結(jié)構(gòu)布局好了,那么你就能夠通過(guò)LINQ查詢(xún)來(lái)查詢(xún)底層的數(shù)據(jù)庫(kù)了。如果你將一個(gè)全新的TRowType類(lèi)的實(shí)例添加到父集合中,然后使用DbContext API保存更改,那么這個(gè)新的對(duì)象就會(huì)變成相應(yīng)表中的一行,該對(duì)象的每個(gè)屬性的值就會(huì)變成該行相應(yīng)的列值。此外,EF有能力表示其他的數(shù)據(jù)庫(kù)工件,比如存儲(chǔ)過(guò)程和函數(shù)。數(shù)據(jù)庫(kù)結(jié)構(gòu)的進(jìn)化是很重要的一個(gè)問(wèn)題,在大多數(shù)情況,隨著應(yīng)用程序的變化,你需要添加列和表,EF是通過(guò)Migration(遷移)功能來(lái)解決這個(gè)問(wèn)題的。這個(gè)能力允許你通過(guò)C#代碼更改數(shù)據(jù)庫(kù)結(jié)構(gòu),除了添加和刪除表和列之外,還可以添加索引。Migration可以沒(méi)有數(shù)據(jù)損失地進(jìn)化數(shù)據(jù)庫(kù)模式。你將會(huì)看到,EF會(huì)暴露你需要使用C#訪問(wèn)的一切數(shù)據(jù)而不需要編寫(xiě)SQL,并且像對(duì)待你整個(gè)應(yīng)用程序代碼的一部分來(lái)對(duì)待數(shù)據(jù)庫(kù)。你可以將migration代碼遷入到源代碼控制系統(tǒng)(Git/SVN)中,因?yàn)樗彩荂#代碼!
八、Entity Framework的架構(gòu)
EF構(gòu)建在provider架構(gòu)之上。當(dāng)開(kāi)發(fā)者使用C#創(chuàng)建一個(gè)LINQ查詢(xún)時(shí),EF框架引擎會(huì)連接一個(gè)provider,將它轉(zhuǎn)換成實(shí)際的SQL語(yǔ)句,最后發(fā)往數(shù)據(jù)庫(kù)。任何給定的provider都是連接Entity Framework和一個(gè)特定的RDBMS的橋梁。一旦該provider執(zhí)行了最終的SQL命令,結(jié)果就被EF物質(zhì)化到.NET對(duì)象中。Data reader就是為了這個(gè)目的。理解EF構(gòu)建于ADO.NET之上非常重要,因此,EF也使用了諸如connection,command,和data reader的概念。談到數(shù)據(jù)持久化,也就是插入,更新和刪除功能,插入時(shí),開(kāi)發(fā)者將一個(gè)實(shí)體類(lèi)的實(shí)例添加到數(shù)據(jù)庫(kù)上下文中。相似地,之前添加到上下文中的實(shí)例被標(biāo)記為changed或deleted,就會(huì)產(chǎn)生對(duì)數(shù)據(jù)庫(kù)即將執(zhí)行更新和刪除的語(yǔ)句。EF會(huì)檢查上下文中的每個(gè)對(duì)象,再次使用provider來(lái)創(chuàng)建RDBMS特定的insert,update,或delete命令。
九、Entity Framework建模和持久化
EF依賴(lài)概念模型完成工作,首先來(lái)理解一下什么是Entity Data Model(EDM)以及EF如何使用它管理數(shù)據(jù)庫(kù)操作。
理解EDM
概念數(shù)據(jù)模型是EF的核心。要使用EF,我們必須創(chuàng)建概念數(shù)據(jù)模型,即EDM。EDM定義了我們的概念模型類(lèi),這些類(lèi)之間的關(guān)系,以及這些模型到數(shù)據(jù)庫(kù)模式之間的映射。
一旦創(chuàng)建了EDM,我們就可以對(duì)概念模型執(zhí)行所有的CRUD操作,EF會(huì)將所有的這些對(duì)象查詢(xún)翻譯成數(shù)據(jù)庫(kù)查詢(xún)(SQL)。一旦這些查詢(xún)執(zhí)行了,EF就會(huì)將返回的結(jié)果轉(zhuǎn)成概念模型對(duì)象實(shí)例。EF會(huì)使用存儲(chǔ)在EDM中的映射信息來(lái)執(zhí)行對(duì)象查詢(xún)到SQL查詢(xún),以及相關(guān)的數(shù)據(jù)到概念模型的翻譯。
一旦EDM準(zhǔn)備就緒,我們就可以使用模型對(duì)象來(lái)執(zhí)行CRUD操作。要能夠執(zhí)行CRUD操作,我們必須使用ObjectContext類(lèi)。接下來(lái)讓我們理解一下這個(gè)類(lèi)。
理解ObjectContext類(lèi)
一旦我創(chuàng)建了EDM,我就有了應(yīng)用程序中可以使用的所有的實(shí)體。然而,我還需要一個(gè)東西來(lái)讓我在這些實(shí)體上執(zhí)行各種操作。它就是EF中的ObjectContext類(lèi)。
ObjectContext類(lèi)是EF中的主要對(duì)象。它負(fù)責(zé):
- 管理數(shù)據(jù)庫(kù)連接。
- 提供執(zhí)行CRUD操作的支持。
- 追蹤模型的更改,目的在于在數(shù)據(jù)庫(kù)中更新模型。
ObjectContext類(lèi)可以理解成管理EDM中所有實(shí)體的東西,讓我們?yōu)檫@些實(shí)體執(zhí)行所有的數(shù)據(jù)庫(kù)操作。當(dāng)我們想要保存一個(gè)新的或者更改的對(duì)象到數(shù)據(jù)庫(kù)時(shí),我們必須調(diào)用ObjectContext類(lèi)中的SaveChanges方法。
還有另一個(gè)類(lèi)DbContext,它和ObjectContext類(lèi)很相似。實(shí)際上,Dbcontext類(lèi)就是ObjectContext類(lèi)的封裝類(lèi)。它是一個(gè)更新的API,而且它提供了更好的API來(lái)管理數(shù)據(jù)庫(kù)連接和執(zhí)行CRUD操作。因?yàn)镈bContext是更好的API,所以我們會(huì)使用DbContext來(lái)執(zhí)行所有的數(shù)據(jù)庫(kù)操作。
十、Entity Framework的三種開(kāi)發(fā)風(fēng)格
- Database First:這是一種用于已存在數(shù)據(jù)庫(kù)模式的方法。使用這種方法,EDM是從數(shù)據(jù)庫(kù)模式中生成的,這種方法最適合于使用了已經(jīng)存在的數(shù)據(jù)庫(kù)的應(yīng)用。
- Code First:這種方法中,所有的領(lǐng)域模型都是以類(lèi)的形式編寫(xiě)的。這些類(lèi)會(huì)建立我們的EDM,數(shù)據(jù)庫(kù)模式會(huì)從這些類(lèi)中創(chuàng)建。這種方法最適合于那些高度以領(lǐng)域?yàn)橹行牟⑶翌I(lǐng)域模型類(lèi)創(chuàng)建優(yōu)先的應(yīng)用程序。這里需要的數(shù)據(jù)庫(kù)只是為了這些領(lǐng)域模型的持久化機(jī)制。
- Model First:這種方法和Code First方法很相似,但是這種情況下我們使用了EDM視覺(jué)設(shè)計(jì)器來(lái)設(shè)計(jì)我們的模型。數(shù)據(jù)庫(kù)模式和類(lèi)將會(huì)通過(guò)這個(gè)概念模型生成。該模型將會(huì)給我們創(chuàng)建數(shù)據(jù)庫(kù)的SQL語(yǔ)句,然后我們可以使用它來(lái)創(chuàng)建數(shù)據(jù)庫(kù)并連接應(yīng)用程序。
三種開(kāi)發(fā)風(fēng)格的比較:
Database First
主要的好處就是:如果數(shù)據(jù)庫(kù)已經(jīng)存在了,那么只需要花一點(diǎn)時(shí)間就可以編寫(xiě)數(shù)據(jù)訪問(wèn)層。EDM可以從數(shù)據(jù)庫(kù)中生成,然后根據(jù)需求更改EDM。
一些場(chǎng)景:
對(duì)遺留的數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā)。
當(dāng)其他團(tuán)隊(duì)的DBA完成了數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),一旦數(shù)據(jù)庫(kù)完成,應(yīng)用開(kāi)發(fā)就要開(kāi)始。
當(dāng)要開(kāi)發(fā)數(shù)據(jù)為中心的應(yīng)用時(shí),應(yīng)用領(lǐng)域模型就是數(shù)據(jù)庫(kù)本身,數(shù)據(jù)庫(kù)會(huì)頻繁修改來(lái)滿(mǎn)足新的需求。
Model First
和Database First相似,Model First最終以EDM結(jié)束。使用該EDM,我們可以創(chuàng)建概念模型和數(shù)據(jù)庫(kù)。使用這種方法的唯一原因就是我們真的想要使用視覺(jué)實(shí)體設(shè)計(jì)器。
Code First
Code First對(duì)于所有的業(yè)務(wù)邏輯以類(lèi)實(shí)現(xiàn),并且數(shù)據(jù)庫(kù)只用作這些模型的持久化機(jī)制時(shí)很有用。
選擇Code First的一些原因:
數(shù)據(jù)庫(kù)只是作為模型的持久化機(jī)制,即數(shù)據(jù)庫(kù)中沒(méi)有邏輯。
完全控制代碼,即沒(méi)有自動(dòng)生成的模型和上下文代碼。
數(shù)據(jù)庫(kù)不會(huì)手動(dòng)更改。模型類(lèi)總是更改,然后數(shù)據(jù)庫(kù)基于模型類(lèi)的更改而更改。
十一、如何選擇持久化方法
方法一:工作流決定樹(shù)

方法二:檢查清單
| 場(chǎng)景 | 方式 |
| 有遺留的數(shù)據(jù)庫(kù)或者數(shù)據(jù)庫(kù)已經(jīng)存在 | Database First |
| 在開(kāi)始開(kāi)發(fā)前,我們會(huì)獲得DBA創(chuàng)建的數(shù)據(jù)庫(kù) | Database First |
| 數(shù)據(jù)庫(kù)頻繁改變,應(yīng)用程序應(yīng)該隨之改變 | Database First |
| 我們想要使用視覺(jué)實(shí)體設(shè)計(jì)器來(lái)生成數(shù)據(jù)庫(kù)和模型類(lèi) | Model First |
| 我們已有模型類(lèi)并且只需要數(shù)據(jù)庫(kù)保存數(shù)據(jù) | Code First |
| 我們想要編寫(xiě)所有的模型類(lèi),實(shí)現(xiàn)這些類(lèi),然后考慮數(shù)據(jù)庫(kù)存儲(chǔ) | Code First |
| 我們不想處理自動(dòng)生成的類(lèi),目更喜歡動(dòng)手親自編寫(xiě) | Code First |
到此這篇關(guān)于Entity Framework系統(tǒng)架構(gòu)與原理的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Entity?Framework使用Fluent?API配置案例
- Entity?Framework實(shí)現(xiàn)數(shù)據(jù)遷移
- Entity?Framework使用配置伙伴創(chuàng)建數(shù)據(jù)庫(kù)
- Entity Framework使用DbModelBuilder API創(chuàng)建表結(jié)構(gòu)
- Entity Framework常用查詢(xún)語(yǔ)句
- Entity Framework中執(zhí)行sql語(yǔ)句
- Entity?Framework?Core實(shí)現(xiàn)Like查詢(xún)?cè)斀?/a>
- Entity Framework Core批處理SQL語(yǔ)句
- Entity Framework Core實(shí)現(xiàn)軟刪除與查詢(xún)過(guò)濾器
- Entity Framework Core生成列并跟蹤列記錄
- Entity?Framework實(shí)體拆分多個(gè)表
相關(guān)文章
asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信
這篇文章介紹了asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
asp.net FindControl方法誤區(qū)和解析
在ASP.NET中Control都有一個(gè)FindControl方法,其作用是根據(jù)ID(注意既不是UniqueID也不是ClientID)在Control所在的命名容器中尋找相應(yīng)控件,但實(shí)際使用中存在很多誤區(qū)和陷阱,下面談?wù)剛€(gè)人對(duì)此的理解2012-01-01
析構(gòu)函數(shù)的作用 什么是析構(gòu)函數(shù)
這篇文章主要講述了析構(gòu)函數(shù)的概念、原理、功能以及定義格式,析構(gòu)函數(shù)是C#程序設(shè)計(jì)中比較重要的概念,需要的朋友可以參考一下2007-12-12
.NET?6中System.Text.Json的七個(gè)特性
這篇文章介紹了.NET?6中System.Text.Json的七個(gè)特性,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
asp.net UpdaeProgress的簡(jiǎn)單用法
這個(gè)控件相比其他控件,屬性少 使用簡(jiǎn)單,就先把這個(gè)控件的一般使用方法簡(jiǎn)單紀(jì)錄下2008-10-10
解析ABP框架領(lǐng)域?qū)又械膶?shí)體類(lèi)與倉(cāng)儲(chǔ)類(lèi)
基于ASP.NET的ABP框架遵循DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),其中就有一個(gè)領(lǐng)域?qū)拥母拍?這里我們就來(lái)解析ABP框架領(lǐng)域?qū)又械膶?shí)體類(lèi)與倉(cāng)儲(chǔ)類(lèi):2016-06-06
利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫(kù)
目前,基于數(shù)據(jù)庫(kù)服務(wù)器的桌面管理程序和Web程序已經(jīng)有太多的應(yīng)用了,尤其是網(wǎng)絡(luò)的大量普及,孤立地?cái)?shù)據(jù)庫(kù)管理系統(tǒng)無(wú)法勝任分布式管理應(yīng)用,但是面對(duì)基于Access數(shù)據(jù)庫(kù)的現(xiàn)有的桌面應(yīng)用我們也無(wú)法完全的摒棄。我們利用.Net 遠(yuǎn)程處理功能將連接和存取Access的行為封裝為一個(gè)遠(yuǎn)程對(duì)象,供網(wǎng)絡(luò)中其它客戶(hù)端通過(guò)調(diào)用該遠(yuǎn)程對(duì)象來(lái)存取實(shí)際的Access數(shù)據(jù)庫(kù)。我們以 C# 2005 為開(kāi)發(fā)語(yǔ)言來(lái)實(shí)現(xiàn)上述功能。2008-04-04

